X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Flib%2Fadvapi32%2Fservice%2Fscm.c;h=cc41f409a684defb6e5ff91497f26a3d2be956e5;hp=a5237cc7a56d051023df4cc6a0f32dafd731dac0;hb=5333007c97e77aba69d4c82a41ac5d1e40a4a9d7;hpb=d71121596205d0eedb9d29cee96cd57ef6b68625;ds=sidebyside diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index a5237cc7a56..cc41f409a68 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -285,6 +285,9 @@ CreateServiceA( LPWSTR lpDependenciesW = NULL; LPWSTR lpServiceStartNameW = NULL; LPWSTR lpPasswordW = NULL; + DWORD dwDependenciesLength = 0; + DWORD dwLength; + LPSTR lpStr; int len = MultiByteToWideChar(CP_ACP, 0, lpServiceName, -1, NULL, 0); lpServiceNameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); @@ -322,8 +325,19 @@ CreateServiceA( } MultiByteToWideChar(CP_ACP, 0, lpLoadOrderGroup, -1, lpLoadOrderGroupW, len); - len = MultiByteToWideChar(CP_ACP, 0, lpDependencies, -1, NULL, 0); - lpDependenciesW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (lpDependencies != NULL) + { + lpStr = (LPSTR)lpDependencies; + while (*lpStr) + { + dwLength = strlen(lpStr) + 1; + dwDependenciesLength += dwLength; + lpStr = lpStr + dwLength; + } + dwDependenciesLength++; + } + + lpDependenciesW = HeapAlloc(GetProcessHeap(), 0, dwDependenciesLength * sizeof(WCHAR)); if (!lpDependenciesW) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -365,13 +379,13 @@ CreateServiceA( cleanup: - if (!lpServiceNameW) HeapFree(GetProcessHeap(), 0, lpServiceNameW); - if (!lpDisplayNameW) HeapFree(GetProcessHeap(), 0, lpDisplayNameW); - if (!lpBinaryPathNameW) HeapFree(GetProcessHeap(), 0, lpBinaryPathNameW); - if (!lpLoadOrderGroupW) HeapFree(GetProcessHeap(), 0, lpLoadOrderGroupW); - if (!lpDependenciesW) HeapFree(GetProcessHeap(), 0, lpDependenciesW); - if (!lpServiceStartNameW) HeapFree(GetProcessHeap(), 0, lpServiceStartNameW); - if (!lpPasswordW) HeapFree(GetProcessHeap(), 0, lpPasswordW); + HeapFree(GetProcessHeap(), 0, lpServiceNameW); + HeapFree(GetProcessHeap(), 0, lpDisplayNameW); + HeapFree(GetProcessHeap(), 0, lpBinaryPathNameW); + HeapFree(GetProcessHeap(), 0, lpLoadOrderGroupW); + HeapFree(GetProcessHeap(), 0, lpDependenciesW); + HeapFree(GetProcessHeap(), 0, lpServiceStartNameW); + HeapFree(GetProcessHeap(), 0, lpPasswordW); return RetVal; }