https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c6d65fec691ea650789b1b2fa5eaf4b8e1d859c4
commit c6d65fec691ea650789b1b2fa5eaf4b8e1d859c4 Author: Hermès Bélusca-Maïto <[email protected]> AuthorDate: Sun Feb 25 00:48:43 2018 +0100 Commit: Hermès Bélusca-Maïto <[email protected]> CommitDate: Sun Feb 25 00:50:01 2018 +0100 [SERVICES] Use safe-string routines in some places, and do not hardcode buffer lengths. --- base/system/services/database.c | 22 ++++++++------- base/system/services/rpcserver.c | 58 ++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/base/system/services/database.c b/base/system/services/database.c index 9ae8441b64..580dc0fd69 100644 --- a/base/system/services/database.c +++ b/base/system/services/database.c @@ -15,6 +15,7 @@ #include "services.h" #include <userenv.h> +#include <strsafe.h> #define NDEBUG #include <debug.h> @@ -88,7 +89,8 @@ ScmCreateNewControlPipe(PSERVICE_IMAGE pServiceImage) } /* Create '\\.\pipe\net\NtControlPipeXXX' instance */ - swprintf(szControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%lu", ServiceCurrent); + StringCchPrintfW(szControlPipeName, ARRAYSIZE(szControlPipeName), + L"\\\\.\\pipe\\net\\NtControlPipe%lu", ServiceCurrent); DPRINT("PipeName: %S\n", szControlPipeName); @@ -1861,7 +1863,8 @@ ScmLoadService(PSERVICE Service, if (Service->dwErrorControl != SERVICE_ERROR_IGNORE) { /* Log a failed service start */ - swprintf(szLogBuffer, L"%lu", dwError); + StringCchPrintfW(szLogBuffer, ARRAYSIZE(szLogBuffer), + L"%lu", dwError); lpLogStrings[0] = Service->lpServiceName; lpLogStrings[1] = szLogBuffer; ScmLogEvent(EVENT_SERVICE_START_FAILED, @@ -1990,19 +1993,21 @@ ScmAutoStartServices(VOID) CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); /* Build the safe boot path */ - wcscpy(szSafeBootServicePath, - L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot"); + StringCchCopyW(szSafeBootServicePath, ARRAYSIZE(szSafeBootServicePath), + L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot"); switch (SafeBootEnabled) { /* NOTE: Assumes MINIMAL (1) and DSREPAIR (3) load same items */ case 1: case 3: - wcscat(szSafeBootServicePath, L"\\Minimal\\"); + StringCchCatW(szSafeBootServicePath, ARRAYSIZE(szSafeBootServicePath), + L"\\Minimal\\"); break; case 2: - wcscat(szSafeBootServicePath, L"\\Network\\"); + StringCchCatW(szSafeBootServicePath, ARRAYSIZE(szSafeBootServicePath), + L"\\Network\\"); break; } @@ -2019,9 +2024,8 @@ ScmAutoStartServices(VOID) RegCloseKey(hKey); /* Finish Safe Boot path off */ - wcsncat(szSafeBootServicePath, - CurrentService->lpServiceName, - MAX_PATH - wcslen(szSafeBootServicePath)); + StringCchCatW(szSafeBootServicePath, ARRAYSIZE(szSafeBootServicePath), + CurrentService->lpServiceName); /* Check that the key is in the Safe Boot path */ dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index 0a518d06ad..e022dff97c 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -13,6 +13,7 @@ #include "services.h" #include <winnls.h> +#include <strsafe.h> #define NDEBUG #include <debug.h> @@ -1241,36 +1242,36 @@ RControlService( if (dwError == ERROR_SUCCESS) { - if (dwControl == SERVICE_CONTROL_STOP || - dwControl == SERVICE_CONTROL_PAUSE || - dwControl == SERVICE_CONTROL_CONTINUE) - { - /* Log a successful send control */ + if (dwControl == SERVICE_CONTROL_STOP || + dwControl == SERVICE_CONTROL_PAUSE || + dwControl == SERVICE_CONTROL_CONTINUE) + { + /* Log a successful send control */ - switch (dwControl) - { - case SERVICE_CONTROL_STOP: - uID = IDS_SERVICE_STOP; - break; + switch (dwControl) + { + case SERVICE_CONTROL_STOP: + uID = IDS_SERVICE_STOP; + break; - case SERVICE_CONTROL_PAUSE: - uID = IDS_SERVICE_PAUSE; - break; + case SERVICE_CONTROL_PAUSE: + uID = IDS_SERVICE_PAUSE; + break; - case SERVICE_CONTROL_CONTINUE: - uID = IDS_SERVICE_RESUME; - break; - } - LoadStringW(GetModuleHandle(NULL), uID, szLogBuffer, 80); + case SERVICE_CONTROL_CONTINUE: + uID = IDS_SERVICE_RESUME; + break; + } + LoadStringW(GetModuleHandle(NULL), uID, szLogBuffer, ARRAYSIZE(szLogBuffer)); - lpLogStrings[0] = lpService->lpDisplayName; - lpLogStrings[1] = szLogBuffer; + lpLogStrings[0] = lpService->lpDisplayName; + lpLogStrings[1] = szLogBuffer; - ScmLogEvent(EVENT_SERVICE_CONTROL_SUCCESS, - EVENTLOG_INFORMATION_TYPE, - 2, - lpLogStrings); - } + ScmLogEvent(EVENT_SERVICE_CONTROL_SUCCESS, + EVENTLOG_INFORMATION_TYPE, + 2, + lpLogStrings); + } } return dwError; @@ -1757,7 +1758,8 @@ RSetServiceStatus( (lpServiceStatus->dwWin32ExitCode != ERROR_SUCCESS)) { /* Log a failed service stop */ - swprintf(szLogBuffer, L"%lu", lpServiceStatus->dwWin32ExitCode); + StringCchPrintfW(szLogBuffer, ARRAYSIZE(szLogBuffer), + L"%lu", lpServiceStatus->dwWin32ExitCode); lpLogStrings[0] = lpService->lpDisplayName; lpLogStrings[1] = szLogBuffer; @@ -1787,7 +1789,7 @@ RSetServiceStatus( break; } - LoadStringW(GetModuleHandle(NULL), uID, szLogBuffer, 80); + LoadStringW(GetModuleHandle(NULL), uID, szLogBuffer, ARRAYSIZE(szLogBuffer)); lpLogStrings[0] = lpService->lpDisplayName; lpLogStrings[1] = szLogBuffer; @@ -1797,8 +1799,6 @@ RSetServiceStatus( lpLogStrings); } - - DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState); DPRINT("RSetServiceStatus() done\n");
