[CIFS] rename cifs_strndup to cifs_strndup_from_ucs
authorSteve French <sfrench@us.ibm.com>
Thu, 30 Apr 2009 17:45:10 +0000 (17:45 +0000)
committerSteve French <sfrench@us.ibm.com>
Thu, 30 Apr 2009 17:45:10 +0000 (17:45 +0000)
In most cases, cifs_strndup is converting from Unicode (UCS2 / UTF-32) to
the configured local code page for the Linux mount (usually UTF8), so
Jeff suggested that to make it more clear that cifs_strndup is doing
a conversion not just memory allocation and copy, rename the function
to including "from_ucs" (ie Unicode)

Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/CHANGES
fs/cifs/cifs_unicode.c
fs/cifs/cifs_unicode.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/sess.c

index 1bf8181362769f9cd9456cff51a623c1d98aa91d..1b0643c2eac601bf1b7c84208744fc89cee75c55 100644 (file)
@@ -2,7 +2,11 @@ Version 1.58
 ------------
 Guard against buffer overruns in various UCS-2 to UTF-8 string conversions
 when the UTF-8 string is composed of unusually long (more than 4 byte) converted
-characters.
+characters. Add support for mounting root of a share which redirects immediately
+to DFS target. Convert string conversion functions from Unicode to more
+accurately mark string length before allocating memory (which may help the
+rare cases where a UTF-8 string is much larger than the UCS2 string that
+we converted from).
  
 Version 1.57
 ------------
index 2a879cff3a40821036c73a6e3c33ce462d343687..6382720acf7c73aa7ed5b0e4884d90c058a84336 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   fs/cifs/cifs_unicode.c
  *
- *   Copyright (c) International Business Machines  Corp., 2000,2005
+ *   Copyright (c) International Business Machines  Corp., 2000,2009
  *   Modified by Steve French (sfrench@us.ibm.com)
  *
  *   This program is free software;  you can redistribute it and/or modify
@@ -244,7 +244,7 @@ cifs_strtoUCS(__le16 *to, const char *from, int len,
 }
 
 /*
- * cifs_strndup - copy a string from wire format to the local codepage
+ * cifs_strndup_from_ucs - copy a string from wire format to the local codepage
  * @src - source string
  * @maxlen - don't walk past this many bytes in the source string
  * @is_unicode - is this a unicode string?
@@ -255,7 +255,7 @@ cifs_strtoUCS(__le16 *to, const char *from, int len,
  * error.
  */
 char *
-cifs_strndup(const char *src, const int maxlen, const bool is_unicode,
+cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode,
             const struct nls_table *codepage)
 {
        int len;
index e620f0b422013b98d5341685d4437e359119fa10..1570a701bf3fabe0af681fad236ec75284acd01c 100644 (file)
@@ -5,7 +5,7 @@
  *     Convert a unicode character to upper or lower case using
  *     compressed tables.
  *
- *   Copyright (c) International Business Machines  Corp., 2000,2007
+ *   Copyright (c) International Business Machines  Corp., 2000,2009
  *
  *   This program is free software;  you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -78,8 +78,9 @@ int cifs_ucs2_bytes(const __le16 *from, int maxbytes,
                    const struct nls_table *codepage);
 int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *);
 int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
-char *cifs_strndup(const char *src, const int maxlen, const bool is_unicode,
-                  const struct nls_table *codepage);
+char *cifs_strndup_from_ucs(const char *src, const int maxlen,
+                           const bool is_unicode,
+                           const struct nls_table *codepage);
 #endif
 
 /*
index dfb8e391d538418f0da7a77c5f7005e3c2237689..df5276e628bfa5a6cac844f5dcf7f7555c8aedcb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   fs/cifs/cifssmb.c
  *
- *   Copyright (C) International Business Machines  Corp., 2002,2008
+ *   Copyright (C) International Business Machines  Corp., 2002,2009
  *   Author(s): Steve French (sfrench@us.ibm.com)
  *
  *   Contains the routines for constructing the SMB PDUs themselves
@@ -2457,7 +2457,7 @@ querySymLinkRetry:
                                           le16_to_cpu(pSMBr->t2.DataOffset);
 
                        /* BB FIXME investigate remapping reserved chars here */
-                       *symlinkinfo = cifs_strndup(data_start, count,
+                       *symlinkinfo = cifs_strndup_from_ucs(data_start, count,
                                                    pSMBr->hdr.Flags2 &
                                                        SMBFLG2_UNICODE,
                                                    nls_codepage);
@@ -3965,8 +3965,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
                /* copy DfsPath */
                temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset);
                max_len = data_end - temp;
-               node->path_name = cifs_strndup(temp, max_len, is_unicode,
-                                              nls_codepage);
+               node->path_name = cifs_strndup_from_ucs(temp, max_len,
+                                                     is_unicode, nls_codepage);
                if (IS_ERR(node->path_name)) {
                        rc = PTR_ERR(node->path_name);
                        node->path_name = NULL;
@@ -3976,8 +3976,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
                /* copy link target UNC */
                temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset);
                max_len = data_end - temp;
-               node->node_name = cifs_strndup(temp, max_len, is_unicode,
-                                              nls_codepage);
+               node->node_name = cifs_strndup_from_ucs(temp, max_len,
+                                                     is_unicode, nls_codepage);
                if (IS_ERR(node->node_name)) {
                        rc = PTR_ERR(node->node_name);
                        node->node_name = NULL;
index 7e5d4fda49369cfacd5f62b0a8e3fb96133e41b5..39f5362e2cb5ff183932098421bbcfebe4395c68 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   fs/cifs/connect.c
  *
- *   Copyright (C) International Business Machines  Corp., 2002,2008
+ *   Copyright (C) International Business Machines  Corp., 2002,2009
  *   Author(s): Steve French (sfrench@us.ibm.com)
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -3463,7 +3463,8 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
                strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
 
                /* mostly informational -- no need to fail on error here */
-               tcon->nativeFileSystem = cifs_strndup(bcc_ptr, bytes_left,
+               tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
+                                                     bytes_left,
                                                      smb_buffer->Flags2 &
                                                         SMBFLG2_UNICODE,
                                                      nls_codepage);
index 93022dc9babb67899b11f553879d40b1b0321edb..2bcff17047abfa3c6ac1bf8422ec8698df5fcf54 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   SMB/CIFS session setup handling routines
  *
- *   Copyright (c) International Business Machines  Corp., 2006, 2007
+ *   Copyright (c) International Business Machines  Corp., 2006, 2009
  *   Author(s): Steve French (sfrench@us.ibm.com)
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -300,7 +300,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses,
        }
 
        kfree(ses->serverOS);
-       ses->serverOS = cifs_strndup(data, bleft, true, nls_cp);
+       ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
        cFYI(1, ("serverOS=%s", ses->serverOS));
        len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
        data += len;
@@ -309,7 +309,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses,
                return;
 
        kfree(ses->serverNOS);
-       ses->serverNOS = cifs_strndup(data, bleft, true, nls_cp);
+       ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
        cFYI(1, ("serverNOS=%s", ses->serverNOS));
        len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
        data += len;
@@ -318,7 +318,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses,
                return;
 
        kfree(ses->serverDomain);
-       ses->serverDomain = cifs_strndup(data, bleft, true, nls_cp);
+       ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
        cFYI(1, ("serverDomain=%s", ses->serverDomain));
 
        return;