Andrew Eikum : services: Fix reading past end of struct (Coverity).

Alexandre Julliard julliard at winehq.org
Mon Feb 12 16:10:37 CST 2018


Module: wine
Branch: master
Commit: b29157e1013681af8e0af924b7cd52ea2fce83e1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b29157e1013681af8e0af924b7cd52ea2fce83e1

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon Feb 12 07:54:33 2018 -0600

services: Fix reading past end of struct (Coverity).

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/services/rpc.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 7c3fa1e..5ecd660 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -821,6 +821,14 @@ DWORD __cdecl svcctl_ChangeServiceConfigW(
     return err;
 }
 
+static void fill_status_process(SERVICE_STATUS_PROCESS *status, struct service_entry *service)
+{
+    struct process_entry *process = service->process;
+    memcpy(status, &service->status, sizeof(service->status));
+    status->dwProcessId     = process ? process->process_id : 0;
+    status->dwServiceFlags  = 0;
+}
+
 static void fill_notify(struct sc_notify_handle *notify)
 {
     SC_RPC_NOTIFY_PARAMS_LIST *list;
@@ -834,8 +842,7 @@ static void fill_notify(struct sc_notify_handle *notify)
     cparams = (SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 *)(list + 1);
 
     cparams->dwNotifyMask = notify->notify_mask;
-    memcpy(&cparams->ServiceStatus, &notify->service->service_entry->status,
-            sizeof(SERVICE_STATUS_PROCESS));
+    fill_status_process(&cparams->ServiceStatus, notify->service->service_entry);
     cparams->dwNotificationStatus = ERROR_SUCCESS;
     cparams->dwNotificationTriggered = 1 << (cparams->ServiceStatus.dwCurrentState - SERVICE_STOPPED);
     cparams->pszServiceNames = NULL;
@@ -1013,14 +1020,6 @@ DWORD __cdecl svcctl_QueryServiceConfig2W( SC_RPC_HANDLE hService, DWORD level,
     return err;
 }
 
-static void fill_status_process(SERVICE_STATUS_PROCESS *status, struct service_entry *service)
-{
-    struct process_entry *process = service->process;
-    memcpy(status, &service->status, sizeof(service->status));
-    status->dwProcessId     = process ? process->process_id : 0;
-    status->dwServiceFlags  = 0;
-}
-
 DWORD __cdecl svcctl_QueryServiceStatusEx(
     SC_RPC_HANDLE hService,
     SC_STATUS_TYPE InfoLevel,




More information about the wine-cvs mailing list