[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