Module: wine Branch: master Commit: ccaaf6957f525f09ba485377a606ce322ab90792 URL: https://source.winehq.org/git/wine.git/?a=commit;h=ccaaf6957f525f09ba485377a...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Aug 13 16:00:27 2020 +0200
kernelbase: Close PEB ConsoleHandle in FreeConsole.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/console.c | 12 ++++++++++++ dlls/kernelbase/console.c | 3 +++ 2 files changed, 15 insertions(+)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 2facdf91fa..32a1275e3e 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -3592,9 +3592,15 @@ static void test_FreeConsole(void) HANDLE handle; BOOL ret;
+ todo_wine + ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n"); + ret = FreeConsole(); ok(ret, "FreeConsole failed: %u\n", GetLastError());
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle == NULL, "ConsoleHandle = %p\n", + RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle); + handle = CreateFileA("CONOUT$", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); ok(handle == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)), @@ -3719,8 +3725,12 @@ static void test_AttachConsole_child(DWORD console_pid) ok(!res && GetLastError() == ERROR_ACCESS_DENIED, "AttachConsole returned: %x(%u)\n", res, GetLastError());
+ todo_wine + ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n"); res = FreeConsole(); ok(res, "FreeConsole failed: %u\n", GetLastError()); + ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle == NULL, "ConsoleHandle = %p\n", + RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle);
SetStdHandle(STD_ERROR_HANDLE, pipe_out);
@@ -3728,6 +3738,8 @@ static void test_AttachConsole_child(DWORD console_pid) ok(res, "AttachConsole failed: %u\n", GetLastError());
ok(pipe_out != GetStdHandle(STD_ERROR_HANDLE), "std handle not set to console\n"); + todo_wine + ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n");
console = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); ok(console != INVALID_HANDLE_VALUE, "Could not open console\n"); diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index 7f9152d5c5..15153dbb6f 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -509,6 +509,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
RtlEnterCriticalSection( &console_section );
+ NtClose( RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle ); + RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = NULL; + if (console_flags & CONSOLE_INPUT_HANDLE) NtClose( GetStdHandle( STD_INPUT_HANDLE )); if (console_flags & CONSOLE_OUTPUT_HANDLE) NtClose( GetStdHandle( STD_OUTPUT_HANDLE )); if (console_flags & CONSOLE_ERROR_HANDLE) NtClose( GetStdHandle( STD_ERROR_HANDLE ));