ScmrControlService: Check access rights.
Modified: trunk/reactos/subsys/system/services/rpcserver.c
_____
Modified: trunk/reactos/subsys/system/services/rpcserver.c
--- trunk/reactos/subsys/system/services/rpcserver.c 2005-11-13
11:29:17 UTC (rev 19206)
+++ trunk/reactos/subsys/system/services/rpcserver.c 2005-11-13
14:15:08 UTC (rev 19207)
@@ -280,12 +280,14 @@
{
PSERVICE_HANDLE hSvc;
PSERVICE lpService;
+ ACCESS_MASK DesiredAccess;
DPRINT("ScmrControlService() called\n");
if (ScmShutdown)
return ERROR_SHUTDOWN_IN_PROGRESS;
+ /* Check the service handle */
hSvc = (PSERVICE_HANDLE)hService;
if (hSvc->Handle.Tag != SERVICE_TAG)
{
@@ -293,10 +295,39 @@
return ERROR_INVALID_HANDLE;
}
+ /* Check access rights */
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ DesiredAccess = SERVICE_STOP;
+ break;
- /* FIXME: Check access rights */
+ case SERVICE_CONTROL_PAUSE:
+ case SERVICE_CONTROL_CONTINUE:
+ DesiredAccess = SERVICE_PAUSE_CONTINUE;
+ break;
+ case SERVICE_INTERROGATE:
+ DesiredAccess = SERVICE_INTERROGATE;
+ break;
+ default:
+ if (dwControl >= 128 && dwControl <= 255)
+ DesiredAccess = SERVICE_USER_DEFINED_CONTROL;
+ else
+ DesiredAccess = SERVICE_QUERY_CONFIG |
+ SERVICE_CHANGE_CONFIG |
+ SERVICE_QUERY_STATUS |
+ SERVICE_START |
+ SERVICE_PAUSE_CONTINUE;
+ break;
+ }
+
+ if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
+ DesiredAccess))
+ return ERROR_ACCESS_DENIED;
+
+ /* Check the service entry point */
lpService = hSvc->ServiceEntry;
if (lpService == NULL)
{
Show replies by date