Skip to content

Commit

Permalink
[CIFS] Fix oops in cifs_strfromUCS_le mounting to servers which do no…
Browse files Browse the repository at this point in the history
…t specify their OS

Fixes kernel bug #10451 http://bugzilla.kernel.org/show_bug.cgi?id=10451

Certain NAS appliances do not set the operating system or network operating system
fields in the session setup response on the wire.  cifs was oopsing on the unexpected
zero length response fields (when trying to null terminate a zero length field).

This fixes the oops.

Acked-by: Jeff Layton <[email protected]>
CC: stable <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
Steve French committed Feb 21, 2009
1 parent 44f68fa commit 6976552
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 3 deletions.
3 changes: 2 additions & 1 deletion fs/cifs/CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ specified and user does not have access to query information about the
top of the share. Fix problem in 2.6.28 resolving DFS paths to
Samba servers (worked to Windows). Fix rmdir so that pending search
(readdir) requests do not get invalid results which include the now
removed directory.
removed directory. Fix oops in cifs_dfs_ref.c when prefixpath is not reachable
when using DFS.

Version 1.55
------------
Expand Down
4 changes: 2 additions & 2 deletions fs/cifs/sess.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,

kfree(ses->serverOS);
/* UTF-8 string will not grow more than four times as big as UCS-16 */
ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
ses->serverOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
if (ses->serverOS != NULL)
cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len, nls_cp);
data += 2 * (len + 1);
Expand All @@ -241,7 +241,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
return rc;

kfree(ses->serverNOS);
ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
ses->serverNOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
if (ses->serverNOS != NULL) {
cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
nls_cp);
Expand Down

0 comments on commit 6976552

Please sign in to comment.