From 2cbfa7cb919848f2d2a44a8570594761cd1b1342 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 21 Sep 2008 15:19:52 +0000 Subject: [PATCH] EnumDependentServicesA/W and EnumServicesStatusA/W don't fix up pointers if the service manager returns an error. This fixes bug #3737. Patch by Michael Martin aka bugboy . svn path=/trunk/; revision=36383 --- reactos/dll/win32/advapi32/service/scm.c | 56 ++++++++++++------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/reactos/dll/win32/advapi32/service/scm.c b/reactos/dll/win32/advapi32/service/scm.c index a47c620a89d..111bd0a614b 100644 --- a/reactos/dll/win32/advapi32/service/scm.c +++ b/reactos/dll/win32/advapi32/service/scm.c @@ -801,6 +801,13 @@ EnumDependentServicesA(SC_HANDLE hService, } _SEH_END; + if (dwError != ERROR_SUCCESS) + { + ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices; for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) { @@ -815,13 +822,6 @@ EnumDependentServicesA(SC_HANDLE hService, lpStatusPtr++; } - if (dwError != ERROR_SUCCESS) - { - ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError); - SetLastError(dwError); - return FALSE; - } - TRACE("EnumDependentServicesA() done\n"); return TRUE; @@ -865,6 +865,13 @@ EnumDependentServicesW(SC_HANDLE hService, } _SEH_END; + if (dwError != ERROR_SUCCESS) + { + ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices; for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) { @@ -879,13 +886,6 @@ EnumDependentServicesW(SC_HANDLE hService, lpStatusPtr++; } - if (dwError != ERROR_SUCCESS) - { - ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError); - SetLastError(dwError); - return FALSE; - } - TRACE("EnumDependentServicesW() done\n"); return TRUE; @@ -957,6 +957,13 @@ EnumServicesStatusA(SC_HANDLE hSCManager, } _SEH_END; + if (dwError != ERROR_SUCCESS) + { + ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices; for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) { @@ -971,13 +978,6 @@ EnumServicesStatusA(SC_HANDLE hSCManager, lpStatusPtr++; } - if (dwError != ERROR_SUCCESS) - { - ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError); - SetLastError(dwError); - return FALSE; - } - TRACE("EnumServicesStatusA() done\n"); return TRUE; @@ -1025,6 +1025,13 @@ EnumServicesStatusW(SC_HANDLE hSCManager, } _SEH_END; + if (dwError != ERROR_SUCCESS) + { + ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices; for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) { @@ -1039,13 +1046,6 @@ EnumServicesStatusW(SC_HANDLE hSCManager, lpStatusPtr++; } - if (dwError != ERROR_SUCCESS) - { - ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError); - SetLastError(dwError); - return FALSE; - } - TRACE("EnumServicesStatusW() done\n"); return TRUE;