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