Commit fb5d9f1d authored by Andy Polyakov's avatar Andy Polyakov Committed by Matt Caswell
Browse files

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: default avatarRichard Levitte <levitte@openssl.org>
parent 647ac8d3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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))
+17 −15
Original line number Diff line number Diff line
@@ -305,12 +305,14 @@ 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)
        if (GetEnvironmentVariableW(L"OPENSSL_WIN32_UTF8", NULL, 0) != 0) {
            WCHAR wresult[BUFSIZ];

            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'\r' &&
                    wresult[numread-1] == L'\n') {
                    wresult[numread-2] = L'\n';
                    numread--;
                }
@@ -321,7 +323,8 @@ static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)

                OPENSSL_cleanse(wresult, sizeof(wresult));
            }
#  else
        } 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) {
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ if (eval { require Win32::API; 1; }) {
        }
    }
}
$ENV{OPENSSL_WIN32_UTF8}=1;

plan tests => 1;