diff options
author | Jeff Layton <jlayton@redhat.com> | 2009-04-30 07:16:21 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2009-04-30 11:45:00 -0400 |
commit | 59140797c5817363087b0ffb46e6bb81a11fe0dc (patch) | |
tree | 8150730b0b0520aa57403cdf068d176f7e1fbddf /fs/cifs/sess.c | |
parent | cc20c031bb067eb3280a1c4b5c42295093e24863 (diff) |
cifs: fix session setup unicode string saving to use new unicode helpers
...and change decode_unicode_ssetup to be a void function. It never
returns an actual error anyway.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Acked-by: Suresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/sess.c')
-rw-r--r-- | fs/cifs/sess.c | 80 |
1 files changed, 22 insertions, 58 deletions
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index c652c73760dd..93022dc9babb 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -277,12 +277,11 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses, | |||
277 | *pbcc_area = bcc_ptr; | 277 | *pbcc_area = bcc_ptr; |
278 | } | 278 | } |
279 | 279 | ||
280 | static int decode_unicode_ssetup(char **pbcc_area, int bleft, | 280 | static void |
281 | struct cifsSesInfo *ses, | 281 | decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, |
282 | const struct nls_table *nls_cp) | 282 | const struct nls_table *nls_cp) |
283 | { | 283 | { |
284 | int rc = 0; | 284 | int len; |
285 | int words_left, len; | ||
286 | char *data = *pbcc_area; | 285 | char *data = *pbcc_area; |
287 | 286 | ||
288 | cFYI(1, ("bleft %d", bleft)); | 287 | cFYI(1, ("bleft %d", bleft)); |
@@ -300,63 +299,29 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft, | |||
300 | ++bleft; | 299 | ++bleft; |
301 | } | 300 | } |
302 | 301 | ||
303 | words_left = bleft / 2; | ||
304 | |||
305 | /* save off server operating system */ | ||
306 | len = UniStrnlen((wchar_t *) data, words_left); | ||
307 | |||
308 | if (len >= words_left) | ||
309 | return rc; | ||
310 | |||
311 | kfree(ses->serverOS); | 302 | kfree(ses->serverOS); |
312 | /* UTF-8 string will not grow more than four times as big as UCS-16 */ | 303 | ses->serverOS = cifs_strndup(data, bleft, true, nls_cp); |
313 | ses->serverOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL); | 304 | cFYI(1, ("serverOS=%s", ses->serverOS)); |
314 | if (ses->serverOS != NULL) { | 305 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
315 | cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len, nls_cp); | 306 | data += len; |
316 | cFYI(1, ("serverOS=%s", ses->serverOS)); | 307 | bleft -= len; |
317 | } | 308 | if (bleft <= 0) |
318 | data += 2 * (len + 1); | 309 | return; |
319 | words_left -= len + 1; | ||
320 | |||
321 | /* save off server network operating system */ | ||
322 | len = UniStrnlen((wchar_t *) data, words_left); | ||
323 | |||
324 | if (len >= words_left) | ||
325 | return rc; | ||
326 | 310 | ||
327 | kfree(ses->serverNOS); | 311 | kfree(ses->serverNOS); |
328 | ses->serverNOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL); | 312 | ses->serverNOS = cifs_strndup(data, bleft, true, nls_cp); |
329 | if (ses->serverNOS != NULL) { | 313 | cFYI(1, ("serverNOS=%s", ses->serverNOS)); |
330 | cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len, | 314 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
331 | nls_cp); | 315 | data += len; |
332 | cFYI(1, ("serverNOS=%s", ses->serverNOS)); | 316 | bleft -= len; |
333 | if (strncmp(ses->serverNOS, "NT LAN Manager 4", 16) == 0) { | 317 | if (bleft <= 0) |
334 | cFYI(1, ("NT4 server")); | 318 | return; |
335 | ses->flags |= CIFS_SES_NT4; | ||
336 | } | ||
337 | } | ||
338 | data += 2 * (len + 1); | ||
339 | words_left -= len + 1; | ||
340 | |||
341 | /* save off server domain */ | ||
342 | len = UniStrnlen((wchar_t *) data, words_left); | ||
343 | |||
344 | if (len > words_left) | ||
345 | return rc; | ||
346 | 319 | ||
347 | kfree(ses->serverDomain); | 320 | kfree(ses->serverDomain); |
348 | ses->serverDomain = kzalloc((4 * len) + 2, GFP_KERNEL); | 321 | ses->serverDomain = cifs_strndup(data, bleft, true, nls_cp); |
349 | if (ses->serverDomain != NULL) { | 322 | cFYI(1, ("serverDomain=%s", ses->serverDomain)); |
350 | cifs_strfromUCS_le(ses->serverDomain, (__le16 *)data, len, | ||
351 | nls_cp); | ||
352 | cFYI(1, ("serverDomain=%s", ses->serverDomain)); | ||
353 | } | ||
354 | data += 2 * (len + 1); | ||
355 | words_left -= len + 1; | ||
356 | 323 | ||
357 | cFYI(1, ("words left: %d", words_left)); | 324 | return; |
358 | |||
359 | return rc; | ||
360 | } | 325 | } |
361 | 326 | ||
362 | static int decode_ascii_ssetup(char **pbcc_area, int bleft, | 327 | static int decode_ascii_ssetup(char **pbcc_area, int bleft, |
@@ -709,8 +674,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, | |||
709 | ++bcc_ptr; | 674 | ++bcc_ptr; |
710 | --bytes_remaining; | 675 | --bytes_remaining; |
711 | } | 676 | } |
712 | rc = decode_unicode_ssetup(&bcc_ptr, bytes_remaining, | 677 | decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses, nls_cp); |
713 | ses, nls_cp); | ||
714 | } else { | 678 | } else { |
715 | rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, | 679 | rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, |
716 | ses, nls_cp); | 680 | ses, nls_cp); |