提交 1fa0e5f8 编写于 作者: A Andy Polyakov

crypto/LPdir_win.c: rationalize temporary allocations.

Reviewed-by: NRichard Levitte <levitte@openssl.org>
上级 46ea8e61
...@@ -76,11 +76,9 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory) ...@@ -76,11 +76,9 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
errno = 0; errno = 0;
if (*ctx == NULL) { if (*ctx == NULL) {
const char *extdir = directory;
char *extdirbuf = NULL;
size_t dirlen = strlen(directory); size_t dirlen = strlen(directory);
if (dirlen == 0) { if (dirlen == 0 || dirlen > INT_MAX - 3) {
errno = ENOENT; errno = ENOENT;
return 0; return 0;
} }
...@@ -92,45 +90,35 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory) ...@@ -92,45 +90,35 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
} }
memset(*ctx, 0, sizeof(**ctx)); 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)) { if (sizeof(TCHAR) != sizeof(char)) {
TCHAR *wdir = NULL; TCHAR *wdir = NULL;
/* len_0 denotes string length *with* trailing 0 */ /* len_0 denotes string length *with* trailing 0 */
size_t index = 0, len_0 = strlen(extdir) + 1; size_t index = 0, len_0 = dirlen + 1;
#ifdef LP_MULTIBYTE_AVAILABLE #ifdef LP_MULTIBYTE_AVAILABLE
int sz = 0; int sz = 0;
UINT cp; UINT cp;
do { do {
# ifdef CP_UTF8 # ifdef CP_UTF8
if ((sz = MultiByteToWideChar((cp = CP_UTF8), 0, extdir, len_0, if ((sz = MultiByteToWideChar((cp = CP_UTF8), 0,
directory, len_0,
NULL, 0)) > 0 || NULL, 0)) > 0 ||
GetLastError() != ERROR_NO_UNICODE_TRANSLATION) GetLastError() != ERROR_NO_UNICODE_TRANSLATION)
break; break;
# endif # endif
sz = MultiByteToWideChar((cp = CP_ACP), 0, extdir, len_0, sz = MultiByteToWideChar((cp = CP_ACP), 0,
directory, len_0,
NULL, 0); NULL, 0);
} while (0); } while (0);
if (sz > 0) { if (sz > 0) {
wdir = _alloca(sz * sizeof(TCHAR)); /*
if (!MultiByteToWideChar(cp, 0, extdir, len_0, wdir, sz)) { * allocate two additional characters in case we need to
if (extdirbuf != NULL) { * concatenate asterisk, |sz| covers trailing '\0'!
free(extdirbuf); */
} wdir = _alloca((sz + 2) * sizeof(TCHAR));
if (!MultiByteToWideChar(cp, 0, directory, len_0,
(WCHAR *)wdir, sz)) {
free(*ctx); free(*ctx);
*ctx = NULL; *ctx = NULL;
errno = EINVAL; errno = EINVAL;
...@@ -139,17 +127,39 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory) ...@@ -139,17 +127,39 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
} else } else
#endif #endif
{ {
wdir = _alloca(len_0 * sizeof(TCHAR)); 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++) for (index = 0; index < len_0; index++)
wdir[index] = (TCHAR)extdir[index]; wdir[index] = (TCHAR)directory[index];
}
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("*"));
} }
(*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx); (*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx);
} else { } else {
(*ctx)->handle = FindFirstFile((TCHAR *)extdir, &(*ctx)->ctx); if (directory[dirlen - 1] != '*') {
} char *buf = _alloca(dirlen + 3);
if (extdirbuf != NULL) {
free(extdirbuf); 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) { if ((*ctx)->handle == INVALID_HANDLE_VALUE) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册