Module: wine Branch: master Commit: 0dbe5adc2117e943c66009dd2b9a744c9a833e72 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dbe5adc2117e943c66009dd2b...
Author: Andrew Cook ariscop@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 );