Skip to content

Commit fff2c10

Browse files
committed
disallow certain characters
1 parent 1e5b50a commit fff2c10

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

lib/cppcheck.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,22 @@ namespace {
320320

321321
std::string CppCheck::cmdFileName(std::string f)
322322
{
323+
// do not allow characters that potentially has a special meaning for the shell
324+
const auto badpos = f.find_first_of("\t\n\r;$<>|&`");
325+
if (badpos != std::string::npos) {
326+
std::string c;
327+
if (f[badpos] == '\n')
328+
c = "<new-line>";
329+
else if (f[badpos] == '\r')
330+
c = "<carriage-return>";
331+
else if (f[badpos] == '\t')
332+
c = "<tab>";
333+
else
334+
c += f[badpos];
335+
throw std::runtime_error("Cppcheck does not allow character " + c + " in filename " + f);
336+
}
323337
f = Path::toNativeSeparators(std::move(f));
324-
if (f.find_first_of(" \t;$<>|&`\n") != std::string::npos)
338+
if (f.find(' ') != std::string::npos)
325339
return "\"" + f + "\"";
326340
return f;
327341
}

test/testcppcheck.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -761,13 +761,15 @@ class TestCppcheck : public TestFixture {
761761
void cmdFileName() const {
762762
ASSERT_EQUALS("x", CppCheck::cmdFileName("x"));
763763
ASSERT_EQUALS("\" \"", CppCheck::cmdFileName(" "));
764-
ASSERT_EQUALS("\"\t\"", CppCheck::cmdFileName("\t"));
765-
ASSERT_EQUALS("\";\"", CppCheck::cmdFileName(";"));
766-
ASSERT_EQUALS("\">\"", CppCheck::cmdFileName(">"));
767-
ASSERT_EQUALS("\"<\"", CppCheck::cmdFileName("<"));
768-
ASSERT_EQUALS("\"|\"", CppCheck::cmdFileName("|"));
769-
ASSERT_EQUALS("\"`\"", CppCheck::cmdFileName("`"));
770-
ASSERT_EQUALS("\"$\"", CppCheck::cmdFileName("$"));
764+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("\t"), std::runtime_error, "Cppcheck does not allow character <tab> in filename \t");
765+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("\r"), std::runtime_error, "Cppcheck does not allow character <carriage-return> in filename \r");
766+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("\n"), std::runtime_error, "Cppcheck does not allow character <new-line> in filename \n");
767+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName(";"), std::runtime_error, "Cppcheck does not allow character ; in filename ;");
768+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName(">"), std::runtime_error, "Cppcheck does not allow character > in filename >");
769+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("<"), std::runtime_error, "Cppcheck does not allow character < in filename <");
770+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("|"), std::runtime_error, "Cppcheck does not allow character | in filename |");
771+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("`"), std::runtime_error, "Cppcheck does not allow character ` in filename `");
772+
ASSERT_THROW_EQUALS(CppCheck::cmdFileName("$"), std::runtime_error, "Cppcheck does not allow character $ in filename $");
771773
}
772774

773775
// TODO: test suppressions

0 commit comments

Comments
 (0)