Commit c011369a authored by Paul Vriens's avatar Paul Vriens Committed by Alexandre Julliard

advapi/service: Check if we have enough access rights to create a service.

parent 5dab8935
...@@ -1315,6 +1315,12 @@ CreateServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName, ...@@ -1315,6 +1315,12 @@ CreateServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName,
return NULL; return NULL;
} }
if (!(hscm->dwAccess & SC_MANAGER_CREATE_SERVICE))
{
SetLastError(ERROR_ACCESS_DENIED);
return NULL;
}
r = RegCreateKeyExW(hscm->hkey, lpServiceName, 0, NULL, r = RegCreateKeyExW(hscm->hkey, lpServiceName, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dp); REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dp);
if (r!=ERROR_SUCCESS) if (r!=ERROR_SUCCESS)
......
...@@ -137,6 +137,7 @@ static void test_create_delete_svc(void) ...@@ -137,6 +137,7 @@ static void test_create_delete_svc(void)
SC_HANDLE scm_handle, svc_handle1; SC_HANDLE scm_handle, svc_handle1;
static const CHAR servicename [] = "Winetest"; static const CHAR servicename [] = "Winetest";
static const CHAR pathname [] = "we_dont_care.exe"; static const CHAR pathname [] = "we_dont_care.exe";
static const CHAR empty [] = "";
/* All NULL */ /* All NULL */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
...@@ -173,13 +174,19 @@ static void test_create_delete_svc(void) ...@@ -173,13 +174,19 @@ static void test_create_delete_svc(void)
/* Both servicename and binary name (We only have connect rights) */ /* Both servicename and binary name (We only have connect rights) */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL); svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL);
todo_wine
{
ok(!svc_handle1, "Expected failure\n"); ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
DeleteService(svc_handle1); /* Wine doesn't care (yet) about access rights, line can be removed when fixed */
CloseServiceHandle(svc_handle1); /* Wine doesn't care (yet) about access rights, line can be removed when fixed */ /* They can even be empty at this stage of parameter checking */
} SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, empty, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, empty, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
CloseServiceHandle(scm_handle); CloseServiceHandle(scm_handle);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment