Don't leak memory in get_service_dependencies().
[nssm.git] / 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