Don't leak memory in get_service_dependencies().
authorIain Patterson <me@iain.cx>
Thu, 21 Jul 2016 16:09:32 +0000 (17:09 +0100)
committerIain Patterson <me@iain.cx>
Thu, 28 Jul 2016 15:44:24 +0000 (16:44 +0100)
Ensure we free qsc when there are no dependencies.
Ensure we free qsc when we couldn't allocate a buffer.
Free the buffer and zero its pointer's size when there are no
dependencies.

service.cpp

index 79c2f56..91435db 100644 (file)
@@ -562,8 +562,10 @@ int get_service_dependencies(const TCHAR *service_name, SC_HANDLE service_handle
   QUERY_SERVICE_CONFIG *qsc = query_service_config(service_name, service_handle);\r
   if (! qsc) return 3;\r
 \r
-  if (! qsc->lpDependencies) return 0;\r
-  if (! qsc->lpDependencies[0]) return 0;\r
+  if (! qsc->lpDependencies || ! qsc->lpDependencies[0]) {\r
+    HeapFree(GetProcessHeap(), 0, qsc);\r
+    return 0;\r
+  }\r
 \r
   /* lpDependencies is doubly NULL terminated. */\r
   while (qsc->lpDependencies[*bufsize]) {\r
@@ -577,6 +579,7 @@ int get_service_dependencies(const TCHAR *service_name, SC_HANDLE service_handle
   if (! *buffer) {\r
     *bufsize = 0;\r
     print_message(stderr, NSSM_MESSAGE_OUT_OF_MEMORY, _T("lpDependencies"), _T("get_service_dependencies()"));\r
+    HeapFree(GetProcessHeap(), 0, qsc);\r
     return 4;\r
   }\r
 \r
@@ -601,6 +604,12 @@ int get_service_dependencies(const TCHAR *service_name, SC_HANDLE service_handle
 \r
   HeapFree(GetProcessHeap(), 0, qsc);\r
 \r
+  if (! *buffer[0]) {\r
+    HeapFree(GetProcessHeap(), 0, *buffer);\r
+    *buffer = 0;\r
+    *bufsize = 0;\r
+  }\r
+\r
   return 0;\r
 }\r
 \r