summaryrefslogtreecommitdiffstats
path: root/crypto/LPdir_win.c
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2016-07-15 15:21:00 +0200
committerAndy Polyakov <appro@openssl.org>2016-07-16 20:30:35 +0200
commit46ea8e610dc045b1a8d383c0fdadb9ff7073f23e (patch)
tree48e52ccf63fd312e7172f59a298462464803d099 /crypto/LPdir_win.c
parentMake fuzzer and fuzz tester builds less magic (diff)
downloadopenssl-46ea8e610dc045b1a8d383c0fdadb9ff7073f23e.tar.xz
openssl-46ea8e610dc045b1a8d383c0fdadb9ff7073f23e.zip
crypto/LPdir_win.c: harmonize with o_fopen.c.
Reviewed-by: Rich Salz <rsalz@openssl.org> Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto/LPdir_win.c')
-rw-r--r--crypto/LPdir_win.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/crypto/LPdir_win.c b/crypto/LPdir_win.c
index 37cca97c40..35d2c9890a 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;
@@ -104,27 +110,41 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
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;
- }
#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, extdir, len_0,
+ NULL, 0)) > 0 ||
+ GetLastError() != ERROR_NO_UNICODE_TRANSLATION)
+ break;
+# endif
+ sz = MultiByteToWideChar((cp = CP_ACP), 0, extdir, len_0,
+ NULL, 0);
+ } while (0);
+
+ if (sz > 0) {
+ wdir = _alloca(sz * sizeof(TCHAR));
+ if (!MultiByteToWideChar(cp, 0, extdir, len_0, wdir, sz)) {
+ if (extdirbuf != NULL) {
+ free(extdirbuf);
+ }
+ free(*ctx);
+ *ctx = NULL;
+ errno = EINVAL;
+ return 0;
+ }
+ } else
#endif
+ {
+ wdir = _alloca(len_0 * sizeof(TCHAR));
for (index = 0; index < len_0; index++)
wdir[index] = (TCHAR)extdir[index];
+ }
(*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx);
-
- free(wdir);
} else {
(*ctx)->handle = FindFirstFile((TCHAR *)extdir, &(*ctx)->ctx);
}
@@ -152,9 +172,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];