https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e0a272c95b910b64c5a183...
commit e0a272c95b910b64c5a18310ea3e90335c3dbf75 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sat Nov 27 02:07:04 2021 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@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 */