Andrew Cook : server: Implement job inheritance.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Apr 2 11:09:20 CDT 2015
Module: wine
Branch: master
Commit: 0dbe5adc2117e943c66009dd2b9a744c9a833e72
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dbe5adc2117e943c66009dd2b9a744c9a833e72
Author: Andrew Cook <ariscop at 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 );
More information about the wine-cvs
mailing list