Module: wine Branch: master Commit: fa2b372ec02d3755ce892612750238f41b39ad85 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fa2b372ec02d3755ce8926127...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Jul 30 17:15:35 2020 +0200
wineconsole: Use console in/out handles only in WINECON_Init.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/wineconsole/winecon_private.h | 2 -- programs/wineconsole/wineconsole.c | 29 ++++++++++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/programs/wineconsole/winecon_private.h b/programs/wineconsole/winecon_private.h index d78502a260..736cf7824e 100644 --- a/programs/wineconsole/winecon_private.h +++ b/programs/wineconsole/winecon_private.h @@ -60,8 +60,6 @@ struct inner_data {
COORD cursor; /* position in cells of cursor */
- HANDLE hConIn; /* console input handle */ - HANDLE hConOut; /* screen buffer handle: has to be changed when active sb changes */ HANDLE console; /* console renderer handle */ HANDLE hProcess; /* handle to the child process or NULL */ HWND hWnd; /* handle of 'user' window or NULL for 'curses' */ diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index c78a7f814b..1104963f0f 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -530,8 +530,6 @@ static void WINECON_Delete(struct inner_data* data) if (!data) return;
if (data->fnDeleteBackend) data->fnDeleteBackend(data); - if (data->hConIn) CloseHandle(data->hConIn); - if (data->hConOut) CloseHandle(data->hConOut); if (data->console) CloseHandle(data->console); if (data->hProcess) CloseHandle(data->hProcess); if (data->overlapped.hEvent) CloseHandle(data->overlapped.hEvent); @@ -584,7 +582,7 @@ static BOOL WINECON_GetServerConfig(struct inner_data* data) * * Spawn the child process when invoked with wineconsole foo bar */ -static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine) +static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine, HANDLE con_in, HANDLE con_out) { PROCESS_INFORMATION info; STARTUPINFOW startup; @@ -598,11 +596,11 @@ static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine) /* the attributes of wineconsole's handles are not adequate for inheritance, so * get them with the correct attributes before process creation */ - if (!DuplicateHandle(GetCurrentProcess(), data->hConIn, GetCurrentProcess(), + if (!DuplicateHandle(GetCurrentProcess(), con_in, GetCurrentProcess(), &startup.hStdInput, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, TRUE, 0) || - !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(), + !DuplicateHandle(GetCurrentProcess(), con_out, GetCurrentProcess(), &startup.hStdOutput, GENERIC_READ|GENERIC_WRITE, TRUE, 0) || - !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(), + !DuplicateHandle(GetCurrentProcess(), con_out, GetCurrentProcess(), &startup.hStdError, GENERIC_READ|GENERIC_WRITE, TRUE, 0)) { WINE_ERR("Can't dup handles\n"); @@ -645,6 +643,8 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna UNICODE_STRING string; IO_STATUS_BLOCK io; condrv_handle_t h; + HANDLE con_in; + HANDLE con_out; NTSTATUS status;
static const WCHAR renderer_pathW[] = {'\','D','e','v','i','c','e','\','C','o','n','D','r','v', @@ -689,11 +689,11 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna req->input_fd = -1;
ret = !wine_server_call_err( req ); - data->hConIn = wine_server_ptr_handle( reply->handle_in ); + con_in = wine_server_ptr_handle( reply->handle_in ); } SERVER_END_REQ; if (!ret) goto error; - WINE_TRACE("using hConIn %p, hSynchro event %p\n", data->hConIn, data->console); + WINE_TRACE("using con_in %p, renderer %p\n", con_in, data->console);
RtlInitUnicodeString(&string, renderer_pathW); attr.ObjectName = &string; @@ -702,23 +702,23 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna 0, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0); if (status) goto error;
- h = condrv_handle(data->hConIn); + h = condrv_handle(con_in); if (!DeviceIoControl(data->console, IOCTL_CONDRV_ATTACH_RENDERER, &h, sizeof(h), NULL, 0, NULL, NULL)) goto error;
SERVER_START_REQ(create_console_output) { - req->handle_in = wine_server_obj_handle( data->hConIn ); + req->handle_in = wine_server_obj_handle( con_in ); req->access = GENERIC_WRITE|GENERIC_READ; req->attributes = 0; req->share = FILE_SHARE_READ|FILE_SHARE_WRITE; req->fd = -1; ret = !wine_server_call_err( req ); - data->hConOut = wine_server_ptr_handle( reply->handle_out ); + con_out = wine_server_ptr_handle( reply->handle_out ); } SERVER_END_REQ; if (!ret) goto error; - WINE_TRACE("using hConOut %p\n", data->hConOut); + WINE_TRACE("using con_out %p\n", con_out);
/* filling data->curcfg from cfg */ switch ((*backend)(data)) @@ -755,7 +755,10 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna lstrlenW(appname) * sizeof(WCHAR), NULL, 0, NULL, NULL); if (!ret) goto error;
- if (cmdline && !WINECON_Spawn(data, cmdline)) goto error; + if (cmdline && !WINECON_Spawn(data, cmdline, con_in, con_out)) goto error; + + CloseHandle(con_in); + CloseHandle(con_out); return data;
case init_failed: