server-JobObjects: Fix a wineserver crash when terminated processes are added to a job.

This commit is contained in:
Sebastian Lackner 2015-02-28 06:52:37 +01:00
parent 1564f9cd05
commit d4871a1b6e
17 changed files with 134 additions and 72 deletions

View File

@ -3357,12 +3357,13 @@ if test "$enable_server_JobObjects" -eq 1; then
patch_apply server-JobObjects/0007-kernel32-tests-Add-tests-for-JOB_OBJECT_LIMIT_ACTIVE.patch
patch_apply server-JobObjects/0008-kernel32-tests-Add-tests-for-JOB_OBJECT_LIMIT_BREAKA.patch
patch_apply server-JobObjects/0009-kernel32-tests-Add-tests-for-job-inheritance.patch
patch_apply server-JobObjects/0010-server-Basic-implementation-of-job-objects.patch
patch_apply server-JobObjects/0011-server-Implement-completion-messages-for-job-objects.patch
patch_apply server-JobObjects/0012-server-Properly-track-handle-count-of-objects.patch
patch_apply server-JobObjects/0010-kernel32-tests-Add-tests-for-adding-a-terminated-pro.patch
patch_apply server-JobObjects/0011-server-Basic-implementation-of-job-objects.-rev-2.patch
patch_apply server-JobObjects/0012-server-Implement-completion-messages-for-job-objects.patch
patch_apply server-JobObjects/0013-server-Properly-track-handle-count-of-objects.patch
patch_apply server-JobObjects/0014-server-Implement-JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.patch
patch_apply server-JobObjects/0014-server-Support-NULL-job-handles-in-IsProcessInJob.patch
patch_apply server-JobObjects/0015-kernel32-tests-Add-tests-for-waiting-on-an-job-objec.patch
patch_apply server-JobObjects/0015-server-Support-NULL-job-handles-in-IsProcessInJob.patch
patch_apply server-JobObjects/0016-kernel32-tests-Add-tests-for-waiting-on-an-job-objec.patch
(
echo '+ { "Sebastian Lackner", "kernel32/tests: Allow multiple subprocess commands in process tests.", 1 },';
echo '+ { "Andrew Cook", "kernel32/tests: Add tests for IsProcessInJob.", 1 },';
@ -3373,7 +3374,8 @@ if test "$enable_server_JobObjects" -eq 1; then
echo '+ { "Andrew Cook", "kernel32/tests: Add tests for JOB_OBJECT_LIMIT_ACTIVE_PROCESS.", 1 },';
echo '+ { "Andrew Cook", "kernel32/tests: Add tests for JOB_OBJECT_LIMIT_BREAKAWAY_OK.", 1 },';
echo '+ { "Andrew Cook", "kernel32/tests: Add tests for job inheritance.", 1 },';
echo '+ { "Andrew Cook", "server: Basic implementation of job objects.", 1 },';
echo '+ { "Sebastian Lackner", "kernel32/tests: Add tests for adding a terminated process to a job object.", 1 },';
echo '+ { "Andrew Cook", "server: Basic implementation of job objects.", 2 },';
echo '+ { "Andrew Cook", "server: Implement completion messages for job objects.", 1 },';
echo '+ { "Andrew Cook", "server: Properly track handle count of objects.", 1 },';
echo '+ { "Andrew Cook", "server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.", 1 },';

View File

@ -1,4 +1,4 @@
From d52b506ca35c8807fbb61b1059b09a507d2e2db9 Mon Sep 17 00:00:00 2001
From d11a4312c95af78a10bda811e91d5175eb63aae4 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Thu, 26 Feb 2015 05:18:09 +0100
Subject: kernel32/tests: Allow multiple subprocess commands in process tests.

View File

@ -1,4 +1,4 @@
From ae2a35cff8966a6754e6f2a8a3b5b92371324a25 Mon Sep 17 00:00:00 2001
From b9cd3dbe08f36f893911a4a0a7100e82bd92e606 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 11:15:03 +1100
Subject: kernel32/tests: Add tests for IsProcessInJob.

View File

@ -1,4 +1,4 @@
From 6d3ab61226d2b6439edf14e67570adfca9ae02dd Mon Sep 17 00:00:00 2001
From b514c502559b1aa3bc4955b7ef2a9bc7be7ef430 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 08:13:08 +0100
Subject: kernel32/tests: Add tests for TerminateJobObject.

View File

@ -1,15 +1,15 @@
From 4392400817c45978dc18fd239cceaca0afeb8429 Mon Sep 17 00:00:00 2001
From 0882ebd11c9d8f52c3454ba715fc4cc3498edca4 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 08:19:59 +0100
Subject: kernel32/tests: Add tests for QueryInformationJobObject
Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
---
dlls/kernel32/tests/process.c | 90 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
dlls/kernel32/tests/process.c | 91 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index bb9053a..9a44ca2 100644
index bb9053a..9508d10 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -71,6 +71,7 @@ static HANDLE (WINAPI *pCreateJobObjectW)(LPSECURITY_ATTRIBUTES sa, LPCWSTR name
@ -118,18 +118,19 @@ index bb9053a..9a44ca2 100644
START_TEST(process)
{
BOOL b = init();
@@ -2291,6 +2376,10 @@ START_TEST(process)
@@ -2291,6 +2376,11 @@ START_TEST(process)
ok(0, "Child process not killed\n");
return;
}
+ else if (!strcmp(myARGV[2], "exit"))
+ {
+ Sleep(100);
+ return;
+ }
ok(0, "Unexpected command %s\n", myARGV[2]);
return;
@@ -2329,4 +2418,5 @@ START_TEST(process)
@@ -2329,4 +2419,5 @@ START_TEST(process)
test_IsProcessInJob();
test_TerminateJobObject();

View File

@ -1,4 +1,4 @@
From 8cbb381bd0c9e3ea085dc4a8d139adbb76115ca4 Mon Sep 17 00:00:00 2001
From ea82086e5c229320cdd8dc187ce3935e67b193b8 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 13:23:35 +0100
Subject: kernel32/tests: Add tests for job object completion ports.
@ -9,7 +9,7 @@ Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
1 file changed, 66 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 9a44ca2..89a0b05 100644
index 9508d10..9d39268 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -72,6 +72,8 @@ static BOOL (WINAPI *pAssignProcessToJobObject)(HANDLE job, HANDLE process);
@ -105,7 +105,7 @@ index 9a44ca2..89a0b05 100644
START_TEST(process)
{
BOOL b = init();
@@ -2419,4 +2484,5 @@ START_TEST(process)
@@ -2420,4 +2485,5 @@ START_TEST(process)
test_IsProcessInJob();
test_TerminateJobObject();
test_QueryInformationJobObject();

View File

@ -1,4 +1,4 @@
From 8f95a75edbefe3c181d8513784b6c46efcc3ebbc Mon Sep 17 00:00:00 2001
From 2bf4061460f17a0986efa2025d7808e11a388136 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 18:06:59 +0100
Subject: kernel32/tests: Add tests for JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
@ -9,7 +9,7 @@ Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
1 file changed, 37 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 89a0b05..1779c81 100644
index 9d39268..c86be74 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2422,6 +2422,42 @@ static void test_CompletionPort(void)
@ -55,7 +55,7 @@ index 89a0b05..1779c81 100644
START_TEST(process)
{
BOOL b = init();
@@ -2485,4 +2521,5 @@ START_TEST(process)
@@ -2486,4 +2522,5 @@ START_TEST(process)
test_TerminateJobObject();
test_QueryInformationJobObject();
test_CompletionPort();

View File

@ -1,4 +1,4 @@
From 7f44ee4aff40ef69667739e3de65d3f0964b2f68 Mon Sep 17 00:00:00 2001
From de031368ea2def75f9eeb259caa17af7bc14a013 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 18:50:14 +0100
Subject: kernel32/tests: Add tests for JOB_OBJECT_LIMIT_ACTIVE_PROCESS.
@ -9,7 +9,7 @@ Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
1 file changed, 93 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 1779c81..fc69ec8 100644
index c86be74..028053b 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2458,6 +2458,98 @@ static void test_KillOnJobClose(void)
@ -111,7 +111,7 @@ index 1779c81..fc69ec8 100644
START_TEST(process)
{
BOOL b = init();
@@ -2522,4 +2614,5 @@ START_TEST(process)
@@ -2523,4 +2615,5 @@ START_TEST(process)
test_QueryInformationJobObject();
test_CompletionPort();
test_KillOnJobClose();

View File

@ -1,4 +1,4 @@
From a9c5a8cc61d479997b30565da77ca7232f7533bc Mon Sep 17 00:00:00 2001
From cccd5e98e933fd8141f7e6924ba2d69c0c3339b8 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 19:03:00 +0100
Subject: kernel32/tests: Add tests for JOB_OBJECT_LIMIT_BREAKAWAY_OK.
@ -9,7 +9,7 @@ Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
1 file changed, 80 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index fc69ec8..1cd591e 100644
index 028053b..f3f9552 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2458,7 +2458,7 @@ static void test_KillOnJobClose(void)
@ -109,7 +109,7 @@ index fc69ec8..1cd591e 100644
BOOL b = init();
ok(b, "Basic init of CreateProcess test\n");
if (!b) return;
@@ -2614,5 +2689,7 @@ START_TEST(process)
@@ -2615,5 +2690,7 @@ START_TEST(process)
test_QueryInformationJobObject();
test_CompletionPort();
test_KillOnJobClose();

View File

@ -1,4 +1,4 @@
From c8ee9251f15aa6e60fe2d4972e4eae2bddf1c849 Mon Sep 17 00:00:00 2001
From b7f6fb29fec1d258bc1db2c110044e2ae2779f9f Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 22:30:28 +0100
Subject: kernel32/tests: Add tests for job inheritance.
@ -9,7 +9,7 @@ Cleanup and improvements by Sebastian Lackner <sebastian@fds-team.de>.
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 1cd591e..9d7d8b8 100644
index f3f9552..466c231 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2466,7 +2466,7 @@ static HANDLE test_LimitActiveProcesses(void)

View File

@ -0,0 +1,41 @@
From c3de2aeaf6101fb30a99bc8e7eaea614d97c4049 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 28 Feb 2015 06:34:24 +0100
Subject: kernel32/tests: Add tests for adding a terminated process to a job
object.
---
dlls/kernel32/tests/process.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 466c231..a464db2 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2260,6 +2260,23 @@ static void test_IsProcessInJob(void)
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
+
+ /* Test adding an already terminated process to a job object */
+ create_process("exit", &pi);
+
+ dwret = WaitForSingleObject(pi.hProcess, 500);
+ ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret);
+
+ SetLastError(0xdeadbeef);
+ ret = pAssignProcessToJobObject(job, pi.hProcess);
+ todo_wine
+ ok(!ret, "AssignProcessToJobObject unexpectedly succeeded\n");
+ todo_wine
+ expect_eq_d(ERROR_ACCESS_DENIED, GetLastError());
+
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+
CloseHandle(job);
}
--
2.3.0

View File

@ -1,7 +1,7 @@
From bc3809dc809edebc43305826f2a687de1089ca26 Mon Sep 17 00:00:00 2001
From 91a03090c8aafda8f47004734a04a0ac8d83a901 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 12:25:23 +1100
Subject: server: Basic implementation of job objects.
Subject: server: Basic implementation of job objects. (rev 2)
This patch includes a (hopefully) complete implementation of process
tracking in job objects, but no limits or events outside of those.
@ -11,17 +11,20 @@ This does not implement nested jobs as found in windows 8.
Changes by Sebastian Lackner <sebastian@fds-team.de>:
* Only use a single list instead of two for active / all processes.
* Various cleanups to fit with the rest of the wineserver coding style.
Changes in revision 2:
* Fix a wineserver crash when terminated processes are added to a job.
---
dlls/kernel32/tests/process.c | 8 +-
dlls/kernel32/tests/process.c | 10 +-
dlls/ntdll/sync.c | 139 ++++++++++++++++++++---
include/winnt.h | 4 +
server/process.c | 254 ++++++++++++++++++++++++++++++++++++++++++
server/process.c | 259 ++++++++++++++++++++++++++++++++++++++++++
server/process.h | 3 +
server/protocol.def | 27 +++++
6 files changed, 415 insertions(+), 20 deletions(-)
6 files changed, 420 insertions(+), 22 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 9d7d8b8..3f78d74 100644
index a464db2..e23d046 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2244,7 +2244,6 @@ static void test_IsProcessInJob(void)
@ -40,7 +43,17 @@ index 9d7d8b8..3f78d74 100644
ok(out, "IsProcessInJob returned out=%u\n", out);
CloseHandle(pi.hProcess);
@@ -2282,13 +2280,11 @@ static void test_TerminateJobObject(void)
@@ -2269,9 +2267,7 @@ static void test_IsProcessInJob(void)
SetLastError(0xdeadbeef);
ret = pAssignProcessToJobObject(job, pi.hProcess);
- todo_wine
ok(!ret, "AssignProcessToJobObject unexpectedly succeeded\n");
- todo_wine
expect_eq_d(ERROR_ACCESS_DENIED, GetLastError());
CloseHandle(pi.hProcess);
@@ -2299,13 +2295,11 @@ static void test_TerminateJobObject(void)
ok(ret, "TerminateJobObject error %u\n", GetLastError());
dwret = WaitForSingleObject(pi.hProcess, 500);
@ -54,7 +67,7 @@ index 9d7d8b8..3f78d74 100644
ok(dwret == 123 || broken(dwret == 0) /* randomly fails on Win 2000 / XP */,
"wrong exitcode %u\n", dwret);
@@ -2397,6 +2393,7 @@ static void test_CompletionPort(void)
@@ -2414,6 +2408,7 @@ static void test_CompletionPort(void)
port_info.CompletionKey = job;
port_info.CompletionPort = port;
ret = pSetInformationJobObject(job, JobObjectAssociateCompletionPortInformation, &port_info, sizeof(port_info));
@ -62,7 +75,7 @@ index 9d7d8b8..3f78d74 100644
ok(ret, "SetInformationJobObject error %u\n", GetLastError());
create_process("wait", &pi);
@@ -2564,7 +2561,6 @@ static HANDLE test_LimitActiveProcesses(void)
@@ -2581,7 +2576,6 @@ static HANDLE test_LimitActiveProcesses(void)
out = FALSE;
ret = pIsProcessInJob(pi[0].hProcess, job, &out);
ok(ret, "IsProcessInJob error %u\n", GetLastError());
@ -70,7 +83,7 @@ index 9d7d8b8..3f78d74 100644
ok(out, "IsProcessInJob returned out=%u\n", out);
dwret = WaitForSingleObject(pi[0].hProcess, 500);
@@ -2595,9 +2591,7 @@ static void test_BreakawayOk(HANDLE job)
@@ -2612,9 +2606,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);
@ -288,7 +301,7 @@ index 4b06b2c..c2aa50e 100644
{
RelationProcessorCore = 0,
diff --git a/server/process.c b/server/process.c
index 0712a5b..5770f0e 100644
index 0712a5b..6384203 100644
--- a/server/process.c
+++ b/server/process.c
@@ -65,6 +65,7 @@ static unsigned int process_map_access( struct object *obj, unsigned int access
@ -299,7 +312,7 @@ index 0712a5b..5770f0e 100644
static const struct object_ops process_ops =
{
@@ -134,6 +135,152 @@ static const struct object_ops startup_info_ops =
@@ -134,6 +135,157 @@ static const struct object_ops startup_info_ops =
startup_info_destroy /* destroy */
};
@ -386,9 +399,14 @@ index 0712a5b..5770f0e 100644
+{
+ assert( job->obj.ops == &job_ops );
+
+ if (!process->running_threads)
+ {
+ set_error( STATUS_PROCESS_IS_TERMINATING );
+ return 0;
+ }
+ if (process->job)
+ {
+ set_error(STATUS_ACCESS_DENIED);
+ set_error( STATUS_ACCESS_DENIED );
+ return 0;
+ }
+
@ -452,7 +470,7 @@ index 0712a5b..5770f0e 100644
struct ptid_entry
{
@@ -327,6 +474,7 @@ struct thread *create_process( int fd, struct thread *parent_thread, int inherit
@@ -327,6 +479,7 @@ struct thread *create_process( int fd, struct thread *parent_thread, int inherit
process->debug_children = 0;
process->is_terminating = 0;
process->is_terminated = 0;
@ -460,7 +478,7 @@ index 0712a5b..5770f0e 100644
process->console = NULL;
process->startup_state = STARTUP_IN_PROGRESS;
process->startup_info = NULL;
@@ -425,6 +573,12 @@ static void process_destroy( struct object *obj )
@@ -425,6 +578,12 @@ static void process_destroy( struct object *obj )
close_process_handles( process );
set_process_startup_state( process, STARTUP_ABORTED );
@ -473,7 +491,7 @@ index 0712a5b..5770f0e 100644
if (process->console) release_object( process->console );
if (process->parent) release_object( process->parent );
if (process->msg_fd) release_object( process->msg_fd );
@@ -709,6 +863,7 @@ static void process_killed( struct process *process )
@@ -709,6 +868,7 @@ static void process_killed( struct process *process )
remove_process_locks( process );
set_process_startup_state( process, STARTUP_ABORTED );
finish_process_tracing( process );
@ -481,7 +499,7 @@ index 0712a5b..5770f0e 100644
start_sigkill_timer( process );
wake_up( &process->obj, 0 );
}
@@ -954,6 +1109,14 @@ DECL_HANDLER(new_process)
@@ -954,6 +1114,14 @@ DECL_HANDLER(new_process)
return;
}
@ -496,7 +514,7 @@ index 0712a5b..5770f0e 100644
if (!req->info_size) /* create an orphaned process */
{
create_process( socket_fd, NULL, 0 );
@@ -1024,6 +1187,12 @@ DECL_HANDLER(new_process)
@@ -1024,6 +1192,12 @@ DECL_HANDLER(new_process)
&& !(req->create_flags & DEBUG_ONLY_THIS_PROCESS);
process->startup_info = (struct startup_info *)grab_object( info );
@ -509,7 +527,7 @@ index 0712a5b..5770f0e 100644
/* connect to the window station */
connect_process_winstation( process, current );
@@ -1361,3 +1530,88 @@ DECL_HANDLER(make_process_system)
@@ -1361,3 +1535,88 @@ DECL_HANDLER(make_process_system)
shutdown_timeout = add_timeout_user( master_socket_timeout, server_shutdown_timeout, NULL );
}
}

View File

@ -1,4 +1,4 @@
From 71738db8658662f68f156ce95d146de2eb68b9cf Mon Sep 17 00:00:00 2001
From f33f2fb03259b0218b83c1f6891b88cd5fe4336f Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 13:02:36 +1100
Subject: server: Implement completion messages for job objects.
@ -15,10 +15,10 @@ coding style by Sebastian Lackner <sebastian@fds-team.de>.
4 files changed, 65 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 3f78d74..ec79418 100644
index e23d046..97ad297 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2393,7 +2393,6 @@ static void test_CompletionPort(void)
@@ -2408,7 +2408,6 @@ static void test_CompletionPort(void)
port_info.CompletionKey = job;
port_info.CompletionPort = port;
ret = pSetInformationJobObject(job, JobObjectAssociateCompletionPortInformation, &port_info, sizeof(port_info));
@ -26,7 +26,7 @@ index 3f78d74..ec79418 100644
ok(ret, "SetInformationJobObject error %u\n", GetLastError());
create_process("wait", &pi);
@@ -2401,16 +2400,13 @@ static void test_CompletionPort(void)
@@ -2416,16 +2415,13 @@ static void test_CompletionPort(void)
ret = pAssignProcessToJobObject(job, pi.hProcess);
ok(ret, "AssignProcessToJobObject error %u\n", GetLastError());
@ -70,7 +70,7 @@ index 56714ef..ef4a4cb 100644
FIXME( "stub: %p %u %p %u\n", handle, class, info, len );
return STATUS_NOT_IMPLEMENTED;
diff --git a/server/process.c b/server/process.c
index 5770f0e..73fe08a 100644
index 6384203..e02b7af 100644
--- a/server/process.c
+++ b/server/process.c
@@ -149,6 +149,9 @@ struct job
@ -106,7 +106,7 @@ index 5770f0e..73fe08a 100644
static int add_job_process( struct job *job, struct process *process )
{
assert( job->obj.ops == &job_ops );
@@ -228,6 +240,7 @@ static int add_job_process( struct job *job, struct process *process )
@@ -233,6 +245,7 @@ static int add_job_process( struct job *job, struct process *process )
list_add_tail( &job->process_list, &process->job_entry );
job->num_processes++;
@ -114,7 +114,7 @@ index 5770f0e..73fe08a 100644
return 1;
}
@@ -242,10 +255,20 @@ static void release_job_process( struct process *process )
@@ -247,10 +260,20 @@ static void release_job_process( struct process *process )
assert( job->obj.ops == &job_ops );
assert( job->num_processes );
job->num_processes--;
@ -135,7 +135,7 @@ index 5770f0e..73fe08a 100644
for (;;) /* restart from the beginning of the list every time */
{
struct process *process;
@@ -259,6 +282,8 @@ static void terminate_job( struct job *job, int exit_code )
@@ -264,6 +287,8 @@ static void terminate_job( struct job *job, int exit_code )
assert( process->job == job );
terminate_process( process, NULL, exit_code );
}
@ -144,7 +144,7 @@ index 5770f0e..73fe08a 100644
}
static void job_destroy( struct object *obj )
@@ -268,6 +293,9 @@ static void job_destroy( struct object *obj )
@@ -273,6 +298,9 @@ static void job_destroy( struct object *obj )
assert( !job->num_processes );
assert( list_empty(&job->process_list) );
@ -154,7 +154,7 @@ index 5770f0e..73fe08a 100644
}
static void job_dump( struct object *obj, int verbose )
@@ -1615,3 +1643,19 @@ DECL_HANDLER(job_set_limits)
@@ -1620,3 +1648,19 @@ DECL_HANDLER(job_set_limits)
release_object( job );
}
}

View File

@ -1,4 +1,4 @@
From d6cd5fe2c7acf2359e96c065254015b5f39fcb2e Mon Sep 17 00:00:00 2001
From 126ffd832a29072552150c335b4f3c945bce5bbe Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 10:51:16 +1100
Subject: server: Properly track handle count of objects.

View File

@ -1,4 +1,4 @@
From 28fdcfb34cac0aee803caa5bb8cb687be197c7d8 Mon Sep 17 00:00:00 2001
From 5762bfcf69275020150ca4c670cace134d0df80f Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 13:10:41 +1100
Subject: server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
@ -9,10 +9,10 @@ Subject: server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index ec79418..3c7d9f6 100644
index 97ad297..5737d2e 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2443,7 +2443,6 @@ static void test_KillOnJobClose(void)
@@ -2458,7 +2458,6 @@ static void test_KillOnJobClose(void)
CloseHandle(job);
dwret = WaitForSingleObject(pi.hProcess, 500);
@ -21,7 +21,7 @@ index ec79418..3c7d9f6 100644
if (dwret == WAIT_TIMEOUT) TerminateProcess(pi.hProcess, 0);
diff --git a/server/process.c b/server/process.c
index 73fe08a..28f872d 100644
index e02b7af..f36548e 100644
--- a/server/process.c
+++ b/server/process.c
@@ -141,6 +141,7 @@ static void job_dump( struct object *obj, int verbose );
@ -41,7 +41,7 @@ index 73fe08a..28f872d 100644
job_destroy /* destroy */
};
@@ -286,6 +287,20 @@ static void terminate_job( struct job *job, int exit_code )
@@ -291,6 +292,20 @@ static void terminate_job( struct job *job, int exit_code )
job->terminating = 0;
}

View File

@ -1,4 +1,4 @@
From 19f32ec2fdf40218519cd34bbcbe782c4517c2fb Mon Sep 17 00:00:00 2001
From 8195735992f652614bc987e7537836703bcb1cdd Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Sat, 28 Feb 2015 13:37:47 +1100
Subject: server: Support NULL job handles in IsProcessInJob.
@ -9,7 +9,7 @@ Subject: server: Support NULL job handles in IsProcessInJob.
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 3c7d9f6..110a770 100644
index 5737d2e..44d98f7 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2238,6 +2238,11 @@ static void test_IsProcessInJob(void)
@ -37,10 +37,10 @@ index 3c7d9f6..110a770 100644
dwret = WaitForSingleObject(pi.hProcess, 500);
diff --git a/server/process.c b/server/process.c
index 28f872d..c8c680f 100644
index f36548e..db5a3b5 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1622,16 +1622,20 @@ DECL_HANDLER(job_assign)
@@ -1627,16 +1627,20 @@ DECL_HANDLER(job_assign)
DECL_HANDLER(process_in_job)
{
struct process *process;

View File

@ -1,4 +1,4 @@
From 2d657a8a1efd0b526ea924996457940c7844b750 Mon Sep 17 00:00:00 2001
From a3247ac2aff0df776fde55fe2da6f2b9f1324abc Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 28 Feb 2015 06:09:16 +0100
Subject: kernel32/tests: Add tests for waiting on an job object.
@ -8,10 +8,10 @@ Subject: kernel32/tests: Add tests for waiting on an job object.
1 file changed, 86 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 110a770..bb1079c 100644
index 44d98f7..0454bb2 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2460,6 +2460,91 @@ static void test_KillOnJobClose(void)
@@ -2475,6 +2475,91 @@ static void test_KillOnJobClose(void)
CloseHandle(pi.hThread);
}
@ -103,7 +103,7 @@ index 110a770..bb1079c 100644
static HANDLE test_LimitActiveProcesses(void)
{
JOBOBJECT_BASIC_LIMIT_INFORMATION limit_info;
@@ -2715,6 +2800,7 @@ START_TEST(process)
@@ -2731,6 +2816,7 @@ START_TEST(process)
test_QueryInformationJobObject();
test_CompletionPort();
test_KillOnJobClose();