Windows: UTF-8 opt-in for command-line arguments and console input.
User can make Windows openssl.exe to treat command-line arguments and console input as UTF-8 By setting OPENSSL_WIN32_UTF8 environment variable (to any value). This is likely to be required for data interchangeability with other OSes and PKCS#12 containers generated with Windows CryptoAPI. Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
647ac8d3d7
commit
fb5d9f1db5
3 changed files with 21 additions and 15 deletions
|
@ -145,6 +145,9 @@ void win32_utf8argv(int *argc, char **argv[])
|
|||
int wlen, ulen, valid = 1;
|
||||
char *arg;
|
||||
|
||||
if (GetEnvironmentVariableW(L"OPENSSL_WIN32_UTF8", NULL, 0) == 0)
|
||||
return;
|
||||
|
||||
newargc = 0;
|
||||
newargv = NULL;
|
||||
if (!validate_argv(newargc))
|
||||
|
|
|
@ -305,23 +305,26 @@ static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)
|
|||
if (is_a_tty) {
|
||||
DWORD numread;
|
||||
# if defined(CP_UTF8)
|
||||
WCHAR wresult[BUFSIZ];
|
||||
if (GetEnvironmentVariableW(L"OPENSSL_WIN32_UTF8", NULL, 0) != 0) {
|
||||
WCHAR wresult[BUFSIZ];
|
||||
|
||||
if (ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE),
|
||||
if (ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE),
|
||||
wresult, maxsize, &numread, NULL)) {
|
||||
if (numread >= 2 &&
|
||||
wresult[numread-2] == L'\r' && wresult[numread-1] == L'\n') {
|
||||
wresult[numread-2] = L'\n';
|
||||
numread--;
|
||||
}
|
||||
wresult[numread] = '\0';
|
||||
if (WideCharToMultiByte(CP_UTF8, 0, wresult, -1,
|
||||
result, sizeof(result), NULL, 0) > 0)
|
||||
p = result;
|
||||
if (numread >= 2 &&
|
||||
wresult[numread-2] == L'\r' &&
|
||||
wresult[numread-1] == L'\n') {
|
||||
wresult[numread-2] = L'\n';
|
||||
numread--;
|
||||
}
|
||||
wresult[numread] = '\0';
|
||||
if (WideCharToMultiByte(CP_UTF8, 0, wresult, -1,
|
||||
result, sizeof(result), NULL, 0) > 0)
|
||||
p = result;
|
||||
|
||||
OPENSSL_cleanse(wresult, sizeof(wresult));
|
||||
}
|
||||
# else
|
||||
OPENSSL_cleanse(wresult, sizeof(wresult));
|
||||
}
|
||||
} else
|
||||
# endif
|
||||
if (ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE),
|
||||
result, maxsize, &numread, NULL)) {
|
||||
if (numread >= 2 &&
|
||||
|
@ -332,7 +335,6 @@ static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)
|
|||
result[numread] = '\0';
|
||||
p = result;
|
||||
}
|
||||
# endif
|
||||
} else
|
||||
# elif defined(OPENSSL_SYS_MSDOS)
|
||||
if (!echo) {
|
||||
|
|
|
@ -53,6 +53,7 @@ if (eval { require Win32::API; 1; }) {
|
|||
}
|
||||
}
|
||||
}
|
||||
$ENV{OPENSSL_WIN32_UTF8}=1;
|
||||
|
||||
plan tests => 1;
|
||||
|
||||
|
|
Loading…
Reference in a new issue