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: Eric Pouech <epouech@codeweavers.com>
This commit is contained in:
Eric Pouech 2023-11-30 18:38:53 +01:00 committed by Alexandre Julliard
parent 000f7faaa2
commit bf97f9490a
5 changed files with 21 additions and 15 deletions

View file

@ -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},

View file

@ -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[] =
{

View file

@ -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;

View file

@ -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 );

View file

@ -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 );