https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f911bb482d2c7ba2ad2fc…
commit f911bb482d2c7ba2ad2fc57e734ee19bd245fcfb
Author:     Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Fri May 22 23:58:12 2020 +0200
Commit:     Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Aug 19 20:36:00 2020 +0200
    [CMD] GOTO: The command should search labels from its position down to the end, then
loop back to the beginning of the batch and down to the original position.
---
 base/shell/cmd/goto.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/base/shell/cmd/goto.c b/base/shell/cmd/goto.c
index 10eeb28b12e..585a9708072 100644
--- a/base/shell/cmd/goto.c
+++ b/base/shell/cmd/goto.c
@@ -36,6 +36,8 @@
 INT cmd_goto(LPTSTR param)
 {
     LPTSTR tmp, tmp2;
+    DWORD dwCurrPos;
+    BOOL bRetry;
     TRACE("cmd_goto(\'%s\')\n", debugstr_aw(param));
@@ -74,14 +76,23 @@ INT cmd_goto(LPTSTR param)
         return 0;
     }
-    /* jump to begin of the file */
-    bc->mempos=0;
+    /*
+     * Search the next label starting our position, until the end of the file.
+     * If none has been found, restart at the beginning of the file, and continue
+     * until reaching back our old current position.
+     */
+    bRetry = FALSE;
+    dwCurrPos = bc->mempos;
+retry:
     while (BatchGetString(textline, ARRAYSIZE(textline)))
     {
         INT pos;
         INT_PTR size;
+        if (bRetry && (bc->mempos >= dwCurrPos))
+            break;
+
         /* Strip out any trailing spaces or control chars */
         tmp = textline + _tcslen(textline) - 1;
         while (tmp > textline && (_istcntrl(*tmp) || _istspace(*tmp) || (*tmp
== _T(':'))))
@@ -112,6 +123,12 @@ INT cmd_goto(LPTSTR param)
             return 0;
         }
     }
+    if (!bRetry && (bc->mempos >= bc->memsize))
+    {
+        bRetry = TRUE;
+        bc->mempos = 0;
+        goto retry;
+    }
     ConErrResPrintf(STRING_GOTO_ERROR2, param);
     ExitBatch();