windows-nls-zero-length-input-20080716
authorAsanka Herath <asanka@secure-endpoints.com>
Wed, 16 Jul 2008 16:22:31 +0000 (16:22 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 16 Jul 2008 16:22:31 +0000 (16:22 +0000)
LICENSE MIT

If the input to the string conversion files is zero length
return nul string instead of NULL.

Pass in -1 instead of computing the strlen.

src/WINNT/afsd/cm_nls.c
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/smb.c

index 0e9e48c..5da8d5e 100644 (file)
@@ -243,6 +243,12 @@ cm_normchar_t * cm_NormalizeStringAlloc(const cm_unichar_t * s, int cch_src, int
     int cch_dest = 0;
     cm_normchar_t * r;
 
+    if (s == NULL || cch_src == 0 || *s == L'\0') {
+        if (pcch_dest)
+            *pcch_dest = ((cch_src != 0)? 1: 0);
+        return wcsdup(L"");
+    }
+
     r = NormalizeUtf16String(s, cch_src, NULL, &cch_dest);
 
     if (pcch_dest)
@@ -286,6 +292,12 @@ cm_utf8char_t * cm_Utf16ToUtf8Alloc(const cm_unichar_t * s, int cch_src, int *pc
     int cch_dest;
     cm_utf8char_t * dest;
 
+    if (s == NULL || cch_src == 0 || *s == L'\0') {
+        if (pcch_dest)
+            *pcch_dest = ((cch_src != 0)?1:0);
+        return strdup("");
+    }
+
     cch_dest = WideCharToMultiByte(CP_UTF8, 0, s, cch_src, NULL, 0, NULL, FALSE);
 
     if (cch_dest == 0) {
@@ -574,9 +586,9 @@ cm_normchar_t *cm_NormalizeUtf8StringToUtf16Alloc(const cm_utf8char_t * src, int
 
     /* Get some edge cases out first, so we don't have to worry about
        cch_src being 0 etc. */
-    if (cch_src == 0) {
-        return NULL;
-    } else if (*src == '\0') {
+    if (cch_src == 0 || src == NULL || *src == '\0') {
+        if (pcch_dest)
+            *pcch_dest = ((cch_src != 0)? 1 : 0);
         return wcsdup(L"");
     }
 
@@ -695,6 +707,12 @@ cm_unichar_t  * cm_Utf8ToUtf16Alloc(const cm_utf8char_t * src, int cch_src, int
     cm_unichar_t * ustr = NULL;
     int cch;
 
+    if (cch_src == 0 || src == NULL || *src == '\0') {
+        if (pcch_dest)
+            *pcch_dest = ((cch_src != 0)? 1 : 0);
+        return wcsdup(L"");
+    }
+
     if (cch_src == -1) {
         cch_src = strlen(src) + 1;
     }
index 391f55c..db15101 100644 (file)
@@ -1312,7 +1312,7 @@ long cm_EvaluateVolumeReference(clientchar_t * namep, long flags, cm_user_t * us
 
      */
 
-    fnamep = cm_ClientStringToFsStringAlloc(namep, cm_ClientStrLen(namep), NULL);
+    fnamep = cm_ClientStringToFsStringAlloc(namep, -1, NULL);
     cp = fnamep + CM_PREFIX_VOL_CCH; /* cp points to cell name, hopefully */
     tp = cm_FsStrChr(cp, '%');
     if (tp == NULL)
index 2b6e12e..ce2f719 100644 (file)
@@ -1831,7 +1831,7 @@ int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp,
             rw = 1;
         }
         /* Get the full name for this cell */
-        cellname = cm_ClientStringToFsStringAlloc(p, cm_ClientStrLen(p), NULL);
+        cellname = cm_ClientStringToFsStringAlloc(p, -1, NULL);
         code = cm_SearchCellFile(cellname, ftemp, 0, 0);
 #ifdef AFS_AFSDB_ENV
         if (code && cm_dnsEnabled) {