Commit bf97f949 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

ntdll: Restrict cases for std handle inheritance in CreateProcess().

Only allow std handle inheritance when: - either bInherit flag of CreateProcess is TRUE, - or child process is in CUI subsystem and STARTF_USESTDHANDLES is no used. Signed-off-by: 's avatarEric Pouech <epouech@codeweavers.com>
parent 000f7faa
......@@ -5014,10 +5014,10 @@ static void test_CreateProcessCUI(void)
{FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, 0},
/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, 0},
{FALSE, 0, CONSOLE_STD, 0, TRUE},
{FALSE, 0, CONSOLE_STD, 0},
{FALSE, DETACHED_PROCESS, CONSOLE_STD, 0},
{FALSE, CREATE_NEW_CONSOLE, CONSOLE_STD, 0},
{FALSE, CREATE_NO_WINDOW, CONSOLE_STD, 0, TRUE},
{FALSE, CREATE_NO_WINDOW, CONSOLE_STD, 0},
/*10*/ {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, 0},
{FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, CONSOLE_STD, 0},
......@@ -5070,10 +5070,10 @@ static void test_CreateProcessCUI(void)
/* 5 */ {TRUE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER},
{TRUE, 0, STARTUPINFO_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_ENABLED_CTRLC},
{TRUE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER},
{FALSE, 0, CONSOLE_STD, TRUE, 0, .is_todo = TRUE},
{FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_GROUP_LEADER, .is_todo = TRUE},
/* 10 */ {FALSE, 0, CONSOLE_STD, FALSE, CP_ENABLED_CTRLC, .is_todo = TRUE},
{FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_GROUP_LEADER, .is_todo = TRUE},
{FALSE, 0, CONSOLE_STD, TRUE, 0},
{FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_GROUP_LEADER},
/* 10 */ {FALSE, 0, CONSOLE_STD, FALSE, CP_ENABLED_CTRLC},
{FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_GROUP_LEADER},
{FALSE, 0, STARTUPINFO_STD, TRUE, 0, .is_todo = TRUE},
{FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_GROUP_LEADER, .is_todo = TRUE},
{FALSE, 0, STARTUPINFO_STD, FALSE, CP_ENABLED_CTRLC, .is_todo = TRUE},
......
......@@ -3254,7 +3254,7 @@ static void test_StdHandleInheritance(void)
{ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK, .is_todo = 6},
/* all others handles type behave as H_DISK */
{ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN},
{ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN},
{ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK, .is_todo = 6},
},
nothing_gui[] =
......@@ -3270,8 +3270,8 @@ static void test_StdHandleInheritance(void)
{ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CONSOLE, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN},
/* all others handles type behave as H_DISK */
{ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN},
{ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7},
{ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN},
{ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 4},
},
detached_cui[] =
{
......
......@@ -2146,7 +2146,8 @@ void init_startup_info(void)
/***********************************************************************
* create_startup_info
*/
void *create_startup_info( const UNICODE_STRING *nt_image, const RTL_USER_PROCESS_PARAMETERS *params,
void *create_startup_info( const UNICODE_STRING *nt_image, ULONG process_flags,
const RTL_USER_PROCESS_PARAMETERS *params,
const pe_image_info_t *pe_info, DWORD *info_size )
{
startup_info_t *info;
......@@ -2175,9 +2176,13 @@ void *create_startup_info( const UNICODE_STRING *nt_image, const RTL_USER_PROCES
info->console_flags = params->ConsoleFlags;
if (pe_info->subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
info->console = wine_server_obj_handle( params->ConsoleHandle );
info->hstdin = wine_server_obj_handle( params->hStdInput );
info->hstdout = wine_server_obj_handle( params->hStdOutput );
info->hstderr = wine_server_obj_handle( params->hStdError );
if ((process_flags & PROCESS_CREATE_FLAGS_INHERIT_HANDLES) ||
(pe_info->subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI && !(params->dwFlags & STARTF_USESTDHANDLES)))
{
info->hstdin = wine_server_obj_handle( params->hStdInput );
info->hstdout = wine_server_obj_handle( params->hStdOutput );
info->hstderr = wine_server_obj_handle( params->hStdError );
}
info->x = params->dwX;
info->y = params->dwY;
info->xsize = params->dwXSize;
......
......@@ -802,7 +802,7 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
goto done;
}
if (!machine) machine = pe_info.machine;
if (!(startup_info = create_startup_info( attr.ObjectName, params, &pe_info, &startup_info_size )))
if (!(startup_info = create_startup_info( attr.ObjectName, process_flags, params, &pe_info, &startup_info_size )))
goto done;
env_size = get_env_size( params, &winedebug );
......
......@@ -178,7 +178,8 @@ extern struct ldt_copy __wine_ldt_copy;
extern void init_environment( int argc, char *argv[], char *envp[] );
extern void init_startup_info(void);
extern void *create_startup_info( const UNICODE_STRING *nt_image, const RTL_USER_PROCESS_PARAMETERS *params,
extern void *create_startup_info( const UNICODE_STRING *nt_image, ULONG process_flags,
const RTL_USER_PROCESS_PARAMETERS *params,
const pe_image_info_t *pe_info, DWORD *info_size );
extern char **build_envp( const WCHAR *envW );
extern char *get_alternate_wineloader( WORD machine );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment