From 725bbcb3aab6bd96059dde4a511e86a7cfe5ce9e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 9 Nov 2011 23:18:37 +0000 Subject: [PATCH] [SERVICES] Improve the parameter checks in RCreateServiceW. svn path=/trunk/; revision=54342 --- reactos/base/system/services/rpcserver.c | 43 +++++++++++++++--------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 6aaa42716ee..e25e8e0a2c7 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -1999,30 +1999,43 @@ DWORD RCreateServiceW( return ERROR_INVALID_PARAMETER; } - if ((dwServiceType & SERVICE_KERNEL_DRIVER) && - (dwServiceType & SERVICE_FILE_SYSTEM_DRIVER)) - { + /* Check for invalid service type value */ + if ((dwServiceType != SERVICE_KERNEL_DRIVER) && + (dwServiceType != SERVICE_FILE_SYSTEM_DRIVER) && + ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_OWN_PROCESS) && + ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_SHARE_PROCESS)) + return ERROR_INVALID_PARAMETER; + + /* Check for invalid start type value */ + if ((dwStartType != SERVICE_BOOT_START) && + (dwStartType != SERVICE_SYSTEM_START) && + (dwStartType != SERVICE_AUTO_START) && + (dwStartType != SERVICE_DEMAND_START) && + (dwStartType != SERVICE_DISABLED)) return ERROR_INVALID_PARAMETER; + + /* Only drivers can be boot start or system start services */ + if ((dwStartType == SERVICE_BOOT_START) || + (dwStartType == SERVICE_SYSTEM_START)) + { + if ((dwServiceType != SERVICE_KERNEL_DRIVER) && + (dwServiceType != SERVICE_FILE_SYSTEM_DRIVER)) + return ERROR_INVALID_PARAMETER; } + /* Check for invalid error control value */ + if ((dwErrorControl != SERVICE_ERROR_IGNORE) && + (dwErrorControl != SERVICE_ERROR_NORMAL) && + (dwErrorControl != SERVICE_ERROR_SEVERE) && + (dwErrorControl != SERVICE_ERROR_CRITICAL)) + return ERROR_INVALID_PARAMETER; + if ((dwServiceType == (SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)) && (lpServiceStartName)) { return ERROR_INVALID_PARAMETER; } - if ((dwServiceType > SERVICE_WIN32_SHARE_PROCESS) && - (dwServiceType != (SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)) && - (dwServiceType != (SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS))) - { - return ERROR_INVALID_PARAMETER; - } - - if (dwStartType > SERVICE_DISABLED) - { - return ERROR_INVALID_PARAMETER; - } - if (lpdwTagId && (!lpLoadOrderGroup || !*lpLoadOrderGroup)) { return ERROR_INVALID_PARAMETER;