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