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