[PATCH 1/1] cmd: Don't loop infinitely on NUL.

Arkadiusz Hiler wine at gitlab.winehq.org
Thu Jun 30 09:03:17 CDT 2022


From: Arkadiusz Hiler <ahiler at codeweavers.com>

Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
---
 programs/cmd/batch.c                     |  4 ++++
 programs/cmd/tests/batch.c               | 22 ++++++++++++++++++++++
 programs/cmd/tests/test_builtins.cmd     |  3 +++
 programs/cmd/tests/test_builtins.cmd.exp |  2 ++
 4 files changed, 31 insertions(+)

diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 9a262c5fec5..5665eb8be53 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -272,6 +272,10 @@ WCHAR *WCMD_fgets(WCHAR *buf, DWORD noChars, HANDLE h)
       for (p = bufA; p < (bufA + charsRead); p = CharNextExA(cp, p, 0)) {
           if (*p == '\n' || *p == '\r')
               break;
+          if (*p == '\0') {
+              heap_free(bufA);
+              return NULL;
+          }
       }
 
       /* Sets file pointer to the start of the next line, if any */
diff --git a/programs/cmd/tests/batch.c b/programs/cmd/tests/batch.c
index 3846693ef2e..ade6587be81 100644
--- a/programs/cmd/tests/batch.c
+++ b/programs/cmd/tests/batch.c
@@ -455,6 +455,24 @@ static int cmd_available(void)
     return FALSE;
 }
 
+void create_nul_test_file(void)
+{
+    HANDLE file;
+    DWORD size;
+    BOOL bres;
+    char contents[] = "a b c\nd e\0f\ng h i";
+
+    file = CreateFileA("nul_test_file", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+            FILE_ATTRIBUTE_NORMAL, NULL);
+    ok(file != INVALID_HANDLE_VALUE, "CreateFile failed\n");
+    if(file == INVALID_HANDLE_VALUE)
+        return;
+
+    bres = WriteFile(file, contents, ARRAYSIZE(contents), &size, NULL);
+    ok(bres, "Could not write to file: %lu\n", GetLastError());
+    CloseHandle(file);
+}
+
 START_TEST(batch)
 {
     int argc;
@@ -479,9 +497,13 @@ START_TEST(batch)
     }
     shortpath_len = GetShortPathNameA(path, shortpath, ARRAY_SIZE(shortpath));
 
+    create_nul_test_file();
+
     argc = winetest_get_mainargs(&argv);
     if(argc > 2)
         run_from_file(argv[2]);
     else
         EnumResourceNamesA(NULL, "TESTCMD", test_enum_proc, 0);
+
+    DeleteFileA("nul_test_file");
 }
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 3f410e55166..3829be50f1a 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1957,6 +1957,9 @@ FOR /F "delims=. tokens=1*" %%A IN (testfile) DO @echo 5:%%A,%%B
 FOR /F "delims=. tokens=2*" %%A IN (testfile) DO @echo 6:%%A,%%B
 FOR /F "delims=. tokens=3*" %%A IN (testfile) DO @echo 7:%%A,%%B
 del testfile
+rem file contains NUL, created by the .exe
+for /f %%A in (nul_test_file) DO echo %%A
+for /f "tokens=*" %%A in (nul_test_file) DO echo %%A
 
 echo ------------ Testing del ------------
 echo abc > file
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 8b6e0914112..437ded18000 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1315,6 +1315,8 @@ h=%h i=b j=c k= l= m=%m n=%n o=%o at or_broken@h=%h i=b j=c k= l= m= n=%n o=%o
 4:3.14,%B
 5:3,14
 6:14,
+a
+a b c
 ------------ Testing del ------------
 deleting 'file'
 errorlevel is 0, good
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/352



More information about the wine-devel mailing list