Jacek Caban : kernelbase: Close PEB ConsoleHandle in FreeConsole.

Alexandre Julliard julliard at winehq.org
Thu Aug 13 15:11:52 CDT 2020


Module: wine
Branch: master
Commit: ccaaf6957f525f09ba485377a606ce322ab90792
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ccaaf6957f525f09ba485377a606ce322ab90792

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Aug 13 16:00:27 2020 +0200

kernelbase: Close PEB ConsoleHandle in FreeConsole.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 ));




More information about the wine-cvs mailing list