[openssl-commits] [openssl] master update

Andy Polyakov appro at openssl.org
Sat Jul 16 18:33:49 UTC 2016


The branch master has been updated
       via  1fa0e5f8f10d768604e6aa45dccb760523b441c8 (commit)
       via  46ea8e610dc045b1a8d383c0fdadb9ff7073f23e (commit)
      from  878f42251b1798c724d8d3f360851d59435772bd (commit)


- Log -----------------------------------------------------------------
commit 1fa0e5f8f10d768604e6aa45dccb760523b441c8
Author: Andy Polyakov <appro at openssl.org>
Date:   Sat Jul 16 13:10:02 2016 +0200

    crypto/LPdir_win.c: rationalize temporary allocations.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>

commit 46ea8e610dc045b1a8d383c0fdadb9ff7073f23e
Author: Andy Polyakov <appro at openssl.org>
Date:   Fri Jul 15 15:21:00 2016 +0200

    crypto/LPdir_win.c: harmonize with o_fopen.c.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    Reviewed-by: Richard Levitte <levitte at openssl.org>

-----------------------------------------------------------------------

Summary of changes:
 crypto/LPdir_win.c | 112 +++++++++++++++++++++++++++++++++--------------------
 1 file changed, 71 insertions(+), 41 deletions(-)

diff --git a/crypto/LPdir_win.c b/crypto/LPdir_win.c
index 37cca97..db3dfce 100644
--- a/crypto/LPdir_win.c
+++ b/crypto/LPdir_win.c
@@ -55,6 +55,12 @@
 # define NAME_MAX 255
 #endif
 
+#ifdef CP_UTF8
+# define CP_DEFAULT CP_UTF8
+#else
+# define CP_DEFAULT CP_ACP
+#endif
+
 struct LP_dir_context_st {
     WIN32_FIND_DATA ctx;
     HANDLE handle;
@@ -70,11 +76,9 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
 
     errno = 0;
     if (*ctx == NULL) {
-        const char *extdir = directory;
-        char *extdirbuf = NULL;
         size_t dirlen = strlen(directory);
 
-        if (dirlen == 0) {
+        if (dirlen == 0 || dirlen > INT_MAX - 3) {
             errno = ENOENT;
             return 0;
         }
@@ -86,50 +90,76 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
         }
         memset(*ctx, 0, sizeof(**ctx));
 
-        if (directory[dirlen - 1] != '*') {
-            extdirbuf = (char *)malloc(dirlen + 3);
-            if (extdirbuf == NULL) {
-                free(*ctx);
-                *ctx = NULL;
-                errno = ENOMEM;
-                return 0;
-            }
-            if (directory[dirlen - 1] != '/' && directory[dirlen - 1] != '\\')
-                extdir = strcat(strcpy(extdirbuf, directory), "/*");
-            else
-                extdir = strcat(strcpy(extdirbuf, directory), "*");
-        }
-
         if (sizeof(TCHAR) != sizeof(char)) {
             TCHAR *wdir = NULL;
             /* len_0 denotes string length *with* trailing 0 */
-            size_t index = 0, len_0 = strlen(extdir) + 1;
-
-            wdir = (TCHAR *)calloc(len_0, sizeof(TCHAR));
-            if (wdir == NULL) {
-                if (extdirbuf != NULL) {
-                    free(extdirbuf);
-                }
-                free(*ctx);
-                *ctx = NULL;
-                errno = ENOMEM;
-                return 0;
-            }
+            size_t index = 0, len_0 = dirlen + 1;
 #ifdef LP_MULTIBYTE_AVAILABLE
-            if (!MultiByteToWideChar
-                (CP_ACP, 0, extdir, len_0, (WCHAR *)wdir, len_0))
+            int sz = 0;
+            UINT cp;
+
+            do {
+# ifdef CP_UTF8
+                if ((sz = MultiByteToWideChar((cp = CP_UTF8), 0,
+                                              directory, len_0,
+                                              NULL, 0)) > 0 ||
+                    GetLastError() != ERROR_NO_UNICODE_TRANSLATION)
+                    break;
+# endif
+                sz = MultiByteToWideChar((cp = CP_ACP), 0,
+                                         directory, len_0,
+                                         NULL, 0);
+            } while (0);
+
+            if (sz > 0) {
+                /*
+                 * allocate two additional characters in case we need to
+                 * concatenate asterisk, |sz| covers trailing '\0'!
+                 */
+                wdir = _alloca((sz + 2) * sizeof(TCHAR));
+                if (!MultiByteToWideChar(cp, 0, directory, len_0,
+                                         (WCHAR *)wdir, sz)) {
+                    free(*ctx);
+                    *ctx = NULL;
+                    errno = EINVAL;
+                    return 0;
+                }
+            } else
 #endif
+            {
+                sz = len_0;
+                /*
+                 * allocate two additional characters in case we need to
+                 * concatenate asterisk, |sz| covers trailing '\0'!
+                 */
+                wdir = _alloca((sz + 2) * sizeof(TCHAR));
                 for (index = 0; index < len_0; index++)
-                    wdir[index] = (TCHAR)extdir[index];
+                    wdir[index] = (TCHAR)directory[index];
+            }
 
-            (*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx);
+            sz--; /* wdir[sz] is trailing '\0' now */
+            if (wdir[sz - 1] != TEXT('*')) {
+                if (wdir[sz - 1] != TEXT('/') && wdir[sz - 1] != TEXT('\\'))
+                    _tcscpy(wdir + sz, TEXT("/*"));
+                else
+                    _tcscpy(wdir + sz, TEXT("*"));
+            }
 
-            free(wdir);
+            (*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx);
         } else {
-            (*ctx)->handle = FindFirstFile((TCHAR *)extdir, &(*ctx)->ctx);
-        }
-        if (extdirbuf != NULL) {
-            free(extdirbuf);
+            if (directory[dirlen - 1] != '*') {
+                char *buf = _alloca(dirlen + 3);
+
+                strcpy(buf, directory);
+                if (buf[dirlen - 1] != '/' && buf[dirlen - 1] != '\\')
+                    strcpy(buf + dirlen, "/*");
+                else
+                    strcpy(buf + dirlen, "*");
+
+                directory = buf;
+            }
+
+            (*ctx)->handle = FindFirstFile((TCHAR *)directory, &(*ctx)->ctx);
         }
 
         if ((*ctx)->handle == INVALID_HANDLE_VALUE) {
@@ -152,9 +182,9 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
         len_0++;
 
 #ifdef LP_MULTIBYTE_AVAILABLE
-        if (!WideCharToMultiByte
-            (CP_ACP, 0, (WCHAR *)wdir, len_0, (*ctx)->entry_name,
-             sizeof((*ctx)->entry_name), NULL, 0))
+        if (!WideCharToMultiByte(CP_DEFAULT, 0, (WCHAR *)wdir, len_0,
+                                 (*ctx)->entry_name,
+                                 sizeof((*ctx)->entry_name), NULL, 0))
 #endif
             for (index = 0; index < len_0; index++)
                 (*ctx)->entry_name[index] = (char)wdir[index];


More information about the openssl-commits mailing list