[NTVDM] DosCreateProcess(): Add failure checks when building the OTVDM command-line.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 27 Nov 2021 01:07:04 +0000 (02:07 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 27 Nov 2021 23:26:46 +0000 (00:26 +0100)
Addendum to commit 0609db55

subsystems/mvdm/ntvdm/dos/dos32krnl/process.c

index b12bd60..a66cf16 100644 (file)
@@ -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 */