Piotr Caban : msiexec: Avoid broken pipe error caused by setting SERVICE_STOPPED state twice.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 4 08:19:27 CST 2015


Module: wine
Branch: master
Commit: 0722a25dcd085a6f981bbc5651a169a4045baf38
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0722a25dcd085a6f981bbc5651a169a4045baf38

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec  4 11:41:43 2015 +0100

msiexec: Avoid broken pipe error caused by setting SERVICE_STOPPED state twice.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/msiexec/service.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/programs/msiexec/service.c b/programs/msiexec/service.c
index 59dfd0e..735cd5c 100644
--- a/programs/msiexec/service.c
+++ b/programs/msiexec/service.c
@@ -47,7 +47,9 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
     status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
     status.dwCurrentState = dwCurrentState;
 
-    if (dwCurrentState == SERVICE_START_PENDING)
+    if (dwCurrentState == SERVICE_START_PENDING
+            || dwCurrentState == SERVICE_STOP_PENDING
+            || dwCurrentState == SERVICE_STOPPED)
         status.dwControlsAccepted = 0;
     else
     {
@@ -81,8 +83,6 @@ static BOOL UpdateSCMStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
 
 static void WINAPI ServiceCtrlHandler(DWORD code)
 {
-    DWORD state = SERVICE_RUNNING;
-
     WINE_TRACE("%d\n", code);
 
     switch (code)
@@ -91,14 +91,12 @@ static void WINAPI ServiceCtrlHandler(DWORD code)
         case SERVICE_CONTROL_STOP:
             UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
             KillService();
-            state = SERVICE_STOPPED;
             break;
         default:
             fprintf(stderr, "Unhandled service control code: %d\n", code);
+            UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
             break;
     }
-
-    UpdateSCMStatus(state, NO_ERROR, 0);
 }
 
 static DWORD WINAPI ServiceExecutionThread(LPVOID param)
@@ -150,10 +148,7 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
     }
 
     UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
-
-    WaitForSingleObject(kill_event, INFINITE);
-    KillService();
-
+    WaitForSingleObject(thread, INFINITE);
     UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
 }
 




More information about the wine-cvs mailing list