From 24ac19c606f28642d0ea5f339a7d0eb0a2526b96 Mon Sep 17 00:00:00 2001 From: Asanka Herath Date: Wed, 16 Jul 2008 16:22:31 +0000 Subject: [PATCH] windows-nls-zero-length-input-20080716 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 | 24 +++++++++++++++++++++--- src/WINNT/afsd/cm_vnodeops.c | 2 +- src/WINNT/afsd/smb.c | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/WINNT/afsd/cm_nls.c b/src/WINNT/afsd/cm_nls.c index 0e9e48cf9..5da8d5e0d 100644 --- a/src/WINNT/afsd/cm_nls.c +++ b/src/WINNT/afsd/cm_nls.c @@ -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; } diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 391f55cee..db1510137 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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) diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 2b6e12ec1..ce2f719f1 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -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) { -- 2.39.5