From 0d2d5fce275e4de10d53a8f6350a4a0b7e23e2b1 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Fri, 20 Jun 2008 20:42:51 +0200
Subject: [PATCH] server: Move the process pipe hangup handling into
 kill_process.

This ensures that it's also done correctly when a read from the pipe
returns EOF.
(cherry picked from commit 24ec4a6ed7bf5c7c8edadc7da3bd5f6160a4d53d)
---
 server/process.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/server/process.c b/server/process.c
index f4277163561..51ada6ebc0c 100644
--- a/server/process.c
+++ b/server/process.c
@@ -459,18 +459,7 @@ static void process_poll_event( struct fd *fd, int event )
     struct process *process = get_fd_user( fd );
     assert( process->obj.ops == &process_ops );
 
-    if (event & (POLLERR | POLLHUP))
-    {
-        release_object( process->msg_fd );
-        process->msg_fd = NULL;
-        if (process->sigkill_timeout)  /* already waiting for it to die */
-        {
-            remove_timeout_user( process->sigkill_timeout );
-            process->sigkill_timeout = NULL;
-            process_died( process );
-        }
-        else kill_process( process, 0 );
-    }
+    if (event & (POLLERR | POLLHUP)) kill_process( process, 0 );
     else if (event & POLLIN) receive_fd( process );
 }
 
@@ -736,6 +725,20 @@ void resume_process( struct process *process )
 /* kill a process on the spot */
 void kill_process( struct process *process, int violent_death )
 {
+    if (!violent_death && process->msg_fd)  /* normal termination on pipe close */
+    {
+        release_object( process->msg_fd );
+        process->msg_fd = NULL;
+    }
+
+    if (process->sigkill_timeout)  /* already waiting for it to die */
+    {
+        remove_timeout_user( process->sigkill_timeout );
+        process->sigkill_timeout = NULL;
+        process_died( process );
+        return;
+    }
+
     if (violent_death) terminate_process( process, NULL, 1 );
     else
     {
-- 
GitLab