Andrew Cook : server: Implement job inheritance.
Module: wine Branch: master Commit: 0dbe5adc2117e943c66009dd2b9a744c9a833e72 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dbe5adc2117e943c66009dd2b... Author: Andrew Cook <ariscop(a)gmail.com> Date: Thu Apr 2 08:56:40 2015 +1100 server: Implement job inheritance. --- dlls/kernel32/tests/process.c | 3 --- server/process.c | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index c991108..a6f86e8 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -2485,7 +2485,6 @@ static void test_jobInheritance(HANDLE job) out = FALSE; ret = pIsProcessInJob(pi.hProcess, job, &out); ok(ret, "IsProcessInJob error %u\n", GetLastError()); - todo_wine ok(out, "IsProcessInJob returned out=%u\n", out); dwret = WaitForSingleObject(pi.hProcess, 1000); @@ -2513,9 +2512,7 @@ static void test_BreakawayOk(HANDLE job) snprintf(buffer, MAX_PATH, "\"%s\" tests/process.c %s", selfname, "exit"); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi); - todo_wine ok(!ret, "CreateProcessA expected failure\n"); - todo_wine expect_eq_d(ERROR_ACCESS_DENIED, GetLastError()); if (ret) diff --git a/server/process.c b/server/process.c index 84c6c82..c124705 100644 --- a/server/process.c +++ b/server/process.c @@ -1039,6 +1039,14 @@ DECL_HANDLER(new_process) return; } + if (parent->job && (req->create_flags & CREATE_BREAKAWAY_FROM_JOB) && + !(parent->job->limit_flags & (JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK))) + { + set_error( STATUS_ACCESS_DENIED ); + close( socket_fd ); + return; + } + if (!req->info_size) /* create an orphaned process */ { create_process( socket_fd, NULL, 0 ); @@ -1109,6 +1117,13 @@ DECL_HANDLER(new_process) && !(req->create_flags & DEBUG_ONLY_THIS_PROCESS); process->startup_info = (struct startup_info *)grab_object( info ); + if (parent->job + && !(req->create_flags & CREATE_BREAKAWAY_FROM_JOB) + && !(parent->job->limit_flags & JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK)) + { + add_job_process( parent->job, process ); + } + /* connect to the window station */ connect_process_winstation( process, current );
participants (1)
-
Alexandre Julliard