https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c6d65fec691ea650789b1b...
commit c6d65fec691ea650789b1b2fa5eaf4b8e1d859c4 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun Feb 25 00:48:43 2018 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org 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");