Paul Chitescu : services.exe: Reduce Registry access to KEY_READ or MAXIMUM_ALLOWED wherever possible.

Alexandre Julliard julliard at winehq.org
Mon Dec 7 10:26:19 CST 2009


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

Author: Paul Chitescu <paulc at voip.null.ro>
Date:   Fri Dec  4 17:58:20 2009 +0200

services.exe: Reduce Registry access to KEY_READ or MAXIMUM_ALLOWED wherever possible.

---

 programs/services/rpc.c      |   39 ++++++++++++++++++++++++---------------
 programs/services/services.c |    4 ++--
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 6327c9a..c647cc8 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -84,6 +84,21 @@ struct sc_lock
     struct scmdatabase *db;
 };
 
+static void free_config_strings(QUERY_SERVICE_CONFIGW *old_cfg, QUERY_SERVICE_CONFIGW *new_cfg)
+{
+    if (old_cfg->lpBinaryPathName != new_cfg->lpBinaryPathName)
+        HeapFree(GetProcessHeap(), 0, old_cfg->lpBinaryPathName);
+
+    if (old_cfg->lpLoadOrderGroup != new_cfg->lpLoadOrderGroup)
+        HeapFree(GetProcessHeap(), 0, old_cfg->lpLoadOrderGroup);
+
+    if (old_cfg->lpServiceStartName != new_cfg->lpServiceStartName)
+        HeapFree(GetProcessHeap(), 0, old_cfg->lpServiceStartName);
+
+    if (old_cfg->lpDisplayName != new_cfg->lpDisplayName)
+        HeapFree(GetProcessHeap(), 0, old_cfg->lpDisplayName);
+}
+
 /* Check if the given handle is of the required type and allows the requested access. */
 static DWORD validate_context_handle(SC_RPC_HANDLE handle, DWORD type, DWORD needed_access, struct sc_handle **out_hdr)
 {
@@ -546,34 +561,28 @@ DWORD svcctl_ChangeServiceConfigW(
 
     /* configuration OK. The strings needs to be duplicated */
     if (lpBinaryPathName != NULL)
-    {
-        HeapFree(GetProcessHeap(), 0, service->service_entry->config.lpBinaryPathName);
         new_entry.config.lpBinaryPathName = strdupW(lpBinaryPathName);
-    }
 
     if (lpLoadOrderGroup != NULL)
-    {
-        HeapFree(GetProcessHeap(), 0, service->service_entry->config.lpLoadOrderGroup);
         new_entry.config.lpLoadOrderGroup = strdupW(lpLoadOrderGroup);
-    }
 
     if (lpServiceStartName != NULL)
-    {
-        HeapFree(GetProcessHeap(), 0, service->service_entry->config.lpServiceStartName);
         new_entry.config.lpServiceStartName = strdupW(lpServiceStartName);
-    }
 
     if (lpDisplayName != NULL)
-    {
-        HeapFree(GetProcessHeap(), 0, service->service_entry->config.lpDisplayName);
         new_entry.config.lpDisplayName = strdupW(lpDisplayName);
-    }
 
-    *service->service_entry = new_entry;
-    save_service_config(service->service_entry);
+    /* try to save to Registry, commit or rollback depending on success */
+    err = save_service_config(&new_entry);
+    if (ERROR_SUCCESS == err)
+    {
+        free_config_strings(&service->service_entry->config,&new_entry.config);
+        *service->service_entry = new_entry;
+    }
+    else free_config_strings(&new_entry.config,&service->service_entry->config);
     service_unlock(service->service_entry);
 
-    return ERROR_SUCCESS;
+    return err;
 }
 
 DWORD svcctl_SetServiceStatus(
diff --git a/programs/services/services.c b/programs/services/services.c
index 24230e4..d6f5e6d 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -376,7 +376,7 @@ static DWORD scmdatabase_create(struct scmdatabase **db)
     InitializeCriticalSection(&(*db)->cs);
 
     err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, SZ_SERVICES_KEY, 0, NULL,
-                          REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
+                          REG_OPTION_NON_VOLATILE, MAXIMUM_ALLOWED, NULL,
                           &(*db)->root_key, NULL);
     if (err != ERROR_SUCCESS)
         HeapFree(GetProcessHeap(), 0, *db);
@@ -417,7 +417,7 @@ static DWORD scmdatabase_load_services(struct scmdatabase *db)
             break;
 
         WINE_TRACE("Loading service %s\n", wine_dbgstr_w(szName));
-        err = RegOpenKeyExW(db->root_key, szName, 0, KEY_READ | KEY_WRITE, &hServiceKey);
+        err = RegOpenKeyExW(db->root_key, szName, 0, KEY_READ, &hServiceKey);
         if (err == ERROR_SUCCESS)
         {
             err = load_service_config(hServiceKey, entry);




More information about the wine-cvs mailing list