https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e0a272c95b910b64c5a18…
commit e0a272c95b910b64c5a18310ea3e90335c3dbf75
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sat Nov 27 02:07:04 2021 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Nov 28 00:26:46 2021 +0100
[NTVDM] DosCreateProcess(): Add failure checks when building the OTVDM command-line.
Addendum to commit 0609db55
---
subsystems/mvdm/ntvdm/dos/dos32krnl/process.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c
b/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c
index b12bd60ee22..a66cf1656d7 100644
--- a/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c
+++ b/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c
@@ -13,7 +13,6 @@
#define NDEBUG
#include <debug.h>
-#include <strsafe.h>
#include "emulator.h"
#include "cpu/cpu.h"
@@ -811,12 +810,25 @@ WORD DosCreateProcess(IN LPCSTR ProgramName,
STARTUPINFOA si;
PROCESS_INFORMATION pi;
+ union { DWORD Size; NTSTATUS Status; } Ret;
CHAR ExpName[MAX_PATH];
- ExpandEnvironmentStringsA(AppName, ExpName, ARRAYSIZE(ExpName) - 1);
- StringCbCatA(ExpName, sizeof(ExpName), "\""); // Add
double-quote before ProgramName
- StringCbCatA(ExpName, sizeof(ExpName), ProgramName); // Append Program name
- StringCbCatA(ExpName, sizeof(ExpName), "\""); // Add
double-quote after ProgramName
+ Ret.Size = ExpandEnvironmentStringsA(AppName, ExpName, _countof(ExpName));
+ if ((Ret.Size == 0) || (Ret.Size > _countof(ExpName)))
+ {
+ /* We failed or buffer too small, fall back to DOS execution */
+ goto RunAsDOS;
+ }
+ Ret.Size--; // Remove NULL-terminator from count
+
+ /* Add double-quotes before and after ProgramName */
+ Ret.Status = RtlStringCchPrintfA(ExpName + Ret.Size, _countof(ExpName) -
Ret.Size,
+ "\"%s\"", ProgramName);
+ if (!NT_SUCCESS(Ret.Status))
+ {
+ /* We failed or buffer too small, fall back to DOS execution */
+ goto RunAsDOS;
+ }
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
@@ -842,7 +854,7 @@ WORD DosCreateProcess(IN LPCSTR ProgramName,
else
{
/* Retrieve the actual path to the "Program Files" directory
for displaying the error */
- ExpandEnvironmentStringsA("%ProgramFiles%", ExpName,
ARRAYSIZE(ExpName) - 1);
+ ExpandEnvironmentStringsA("%ProgramFiles%", ExpName,
_countof(ExpName));
DisplayMessage(L"Trying to load '%S'.\n"
L"WOW16 applications are not supported internally by
NTVDM at the moment.\n"
@@ -852,6 +864,7 @@ WORD DosCreateProcess(IN LPCSTR ProgramName,
}
// Fall through
}
+ RunAsDOS:
case SCS_DOS_BINARY:
{
/* Load the executable */