[CMD] IF: Add extra validity checks in ExecuteIf().
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 3 Sep 2020 14:03:18 +0000 (16:03 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 3 Sep 2020 14:05:55 +0000 (16:05 +0200)
base/shell/cmd/cmd.c
base/shell/cmd/if.c

index fbc1215..f760bf7 100644 (file)
@@ -938,7 +938,7 @@ GetEnvVarOrSpecial(LPCTSTR varName)
     /* %CMDEXTVERSION% */
     else if (_tcsicmp(varName, _T("CMDEXTVERSION")) == 0)
     {
-        /* Set version number to CMDEXTVERSION */
+        /* Set Command Extensions version number to CMDEXTVERSION */
         _itot(CMDEXTVERSION, ret, 10);
         return ret;
     }
index e74298a..66526ee 100644 (file)
@@ -78,20 +78,19 @@ INT ExecuteIf(PARSED_COMMAND *Cmd)
     Right = DoDelayedExpansion(Cmd->If.RightArg);
     if (!Right)
     {
-        cmd_free(Left);
+        if (Left) cmd_free(Left);
         return 1;
     }
 
     if (bEnableExtensions && (Cmd->If.Operator == IF_CMDEXTVERSION))
     {
-        /* IF CMDEXTVERSION n: check if Command Extensions version
-         * is greater or equal to n */
+        /* IF CMDEXTVERSION n: check if Command Extensions
+         * version is greater or equal to n. */
         DWORD n = _tcstoul(Right, &param, 10);
         if (*param != _T('\0'))
         {
             error_syntax(Right);
-            cmd_free(Right);
-            return 1;
+            goto fail;
         }
         result = (CMDEXTVERSION >= n);
     }
@@ -107,8 +106,7 @@ INT ExecuteIf(PARSED_COMMAND *Cmd)
         if (*param != _T('\0'))
         {
             error_syntax(Right);
-            cmd_free(Right);
-            return 1;
+            goto fail;
         }
         result = (nErrorLevel >= n);
     }
@@ -178,11 +176,19 @@ INT ExecuteIf(PARSED_COMMAND *Cmd)
             case IF_LEQ: result = (result <= 0); break;
             case IF_GTR: result = (result >  0); break;
             case IF_GEQ: result = (result >= 0); break;
+            default: goto unknownOp;
             }
         }
+        else
+        {
+unknownOp:
+            ERR("Unknown IF operator 0x%x\n", Cmd->If.Operator);
+            ASSERT(FALSE);
+            goto fail;
+        }
     }
 
-    cmd_free(Left);
+    if (Left) cmd_free(Left);
     cmd_free(Right);
 
     if (result ^ ((Cmd->If.Flags & IFFLAG_NEGATE) != 0))
@@ -195,6 +201,11 @@ INT ExecuteIf(PARSED_COMMAND *Cmd)
         /* Full condition was false, do the "else" command if there is one */
         return ExecuteCommand(Cmd->Subcommands->Next);
     }
+
+fail:
+    if (Left) cmd_free(Left);
+    cmd_free(Right);
+    return 1;
 }
 
 /* EOF */