From 87659d00ec00b4fe49a4e4e0b942f62f343f474f Mon Sep 17 00:00:00 2001 From: chencheng mao Date: Mon, 28 Sep 2026 14:25:43 -0600 Subject: [PATCH 1/2] Fix crash with NUL character in path given to --file-list Co-Authored-By: Claude Fable 5.1 --- cli/filelister.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cli/filelister.cpp b/cli/filelister.cpp index 9b95689679c..de57af450e4 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -168,6 +168,9 @@ std::string FileLister::addFiles(std::list &files, const std::s if (path.empty()) return "no path specified"; + if (path.find('\0') != std::string::npos) + return "path contains a NUL character"; + std::list filesSorted; std::string err = addFiles2(filesSorted, path, extra, recursive, ignored, debug); @@ -285,6 +288,9 @@ std::string FileLister::addFiles(std::list &files, const std::s if (path.empty()) return "no path specified"; + if (path.find('\0') != std::string::npos) + return "path contains a NUL character"; + std::string corrected_path = path; if (endsWith(corrected_path, '/')) corrected_path.erase(corrected_path.end() - 1); From 06306872dd8c8d46d34e34e19ae9e03944d0e594 Mon Sep 17 00:00:00 2001 From: chencheng mao Date: Thu, 1 Oct 2026 16:05:27 -0600 Subject: [PATCH 2/2] Name the offending path in the NUL character error and add a test Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_011BxKvJgr98DbCiLT3aKnmu --- cli/filelister.cpp | 10 ++++++---- test/testfilelister.cpp | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cli/filelister.cpp b/cli/filelister.cpp index de57af450e4..1bc03017e79 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -168,8 +168,9 @@ std::string FileLister::addFiles(std::list &files, const std::s if (path.empty()) return "no path specified"; - if (path.find('\0') != std::string::npos) - return "path contains a NUL character"; + const std::string::size_type nulPos = path.find('\0'); + if (nulPos != std::string::npos) + return "path '" + path.substr(0, nulPos) + "' contains a NUL character"; std::list filesSorted; @@ -288,8 +289,9 @@ std::string FileLister::addFiles(std::list &files, const std::s if (path.empty()) return "no path specified"; - if (path.find('\0') != std::string::npos) - return "path contains a NUL character"; + const std::string::size_type nulPos = path.find('\0'); + if (nulPos != std::string::npos) + return "path '" + path.substr(0, nulPos) + "' contains a NUL character"; std::string corrected_path = path; if (endsWith(corrected_path, '/')) diff --git a/test/testfilelister.cpp b/test/testfilelister.cpp index 13057735513..b90a8cb55e7 100644 --- a/test/testfilelister.cpp +++ b/test/testfilelister.cpp @@ -36,6 +36,7 @@ class TestFileLister : public TestFixture { void run() override { TEST_CASE(recursiveAddFiles); TEST_CASE(recursiveAddFilesEmptyPath); + TEST_CASE(recursiveAddFilesNulInPath); TEST_CASE(excludeFile1); TEST_CASE(excludeFile2); TEST_CASE(excludeDir); @@ -110,6 +111,13 @@ class TestFileLister : public TestFixture { ASSERT_EQUALS("no path specified", err); } + void recursiveAddFilesNulInPath() const { + std::list files; + const std::string err = FileLister::recursiveAddFiles(files, std::string("lib\0", 4), {}, PathMatch()); + ASSERT_EQUALS("path 'lib' contains a NUL character", err); + ASSERT(files.empty()); + } + void excludeFile1() const { const std::string basedir = findBaseDir();