From e0a272c95b910b64c5a18310ea3e90335c3dbf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 27 Nov 2021 02:07:04 +0100 Subject: [PATCH] [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 -#include #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 */