Module: wine Branch: master Commit: c11e163eb789d099b70261afd3303d8ff8e826ee URL: http://source.winehq.org/git/wine.git/?a=commit;h=c11e163eb789d099b70261afd3...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Dec 12 11:03:55 2011 +0100
services: Fix SERVICE_STATUS initialization in svcctl_ControlService.
---
programs/services/rpc.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 33 insertions(+), 14 deletions(-)
diff --git a/programs/services/rpc.c b/programs/services/rpc.c index 806e65d..5fe8585 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -1048,29 +1048,35 @@ DWORD __cdecl svcctl_ControlService(
service_lock_exclusive(service->service_entry);
- if (lpServiceStatus) - { - lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType; - lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState; - lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; - lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; - lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; - lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint; - lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint; - } - + result = ERROR_SUCCESS; switch (service->service_entry->status.dwCurrentState) { case SERVICE_STOPPED: - service_unlock(service->service_entry); - return ERROR_SERVICE_NOT_ACTIVE; + result = ERROR_SERVICE_NOT_ACTIVE; + break; case SERVICE_START_PENDING: if (dwControl==SERVICE_CONTROL_STOP) break; /* fall thru */ case SERVICE_STOP_PENDING: + result = ERROR_SERVICE_CANNOT_ACCEPT_CTRL; + break; + } + + if (result != ERROR_SUCCESS) + { + if (lpServiceStatus) + { + lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType; + lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState; + lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; + lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; + lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; + lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint; + lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint; + } service_unlock(service->service_entry); - return ERROR_SERVICE_CANNOT_ACCEPT_CTRL; + return result; }
if (!service_accepts_control(service->service_entry, dwControl)) @@ -1096,6 +1102,19 @@ DWORD __cdecl svcctl_ControlService( { service_send_control(service->service_entry, control_pipe, dwControl, &result);
+ if (lpServiceStatus) + { + service_lock_shared(service->service_entry); + lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType; + lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState; + lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; + lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; + lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; + lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint; + lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint; + service_unlock(service->service_entry); + } + if (dwControl == SERVICE_CONTROL_STOP) { CloseHandle(control_mutex);