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