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 */