[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