diff options
author | Shoaib Meenai <smeenai@fb.com> | 2019-04-16 00:18:50 +0000 |
---|---|---|
committer | Shoaib Meenai <smeenai@fb.com> | 2019-04-16 00:18:50 +0000 |
commit | 1826095a5faa4303c9fb5d3c5aadc46bf66c1cd6 (patch) | |
tree | 4544dcf818a516e53203e0a151a313193dacbc4c /llvm/unittests/Support/CommandLineTest.cpp | |
parent | 0a61be96fc9f10f400497e98f5adb9cc467c98c6 (diff) | |
download | llvm-1826095a5faa4303c9fb5d3c5aadc46bf66c1cd6.zip llvm-1826095a5faa4303c9fb5d3c5aadc46bf66c1cd6.tar.gz llvm-1826095a5faa4303c9fb5d3c5aadc46bf66c1cd6.tar.bz2 |
Reapply [Support] Fix recursive response file expansion guard
The test in the dependent revision has been fixed for Windows.
Original commit message:
Response file expansion limits the amount of expansion to prevent
potential infinite recursion. However, the current logic assumes that
any argument beginning with @ is a response file, which is not true for
e.g. `-Xlinker -rpath -Xlinker @executable_path/../lib` on Darwin.
Having too many of these non-response file arguments beginning with @
prevents actual response files from being expanded. Instead, limit based
on the number of successful response file expansions, which should still
prevent infinite recursion but also avoid false positives.
Differential Revision: https://reviews.llvm.org/D60631
> llvm-svn: 358452
llvm-svn: 358466
Diffstat (limited to 'llvm/unittests/Support/CommandLineTest.cpp')
-rw-r--r-- | llvm/unittests/Support/CommandLineTest.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/unittests/Support/CommandLineTest.cpp b/llvm/unittests/Support/CommandLineTest.cpp index 263d0e3..b648600 100644 --- a/llvm/unittests/Support/CommandLineTest.cpp +++ b/llvm/unittests/Support/CommandLineTest.cpp @@ -816,6 +816,43 @@ TEST(CommandLineTest, RecursiveResponseFiles) { EXPECT_STREQ(Argv[i], ResponseFileRef.c_str()); } +TEST(CommandLineTest, ResponseFilesAtArguments) { + SmallString<128> TestDir; + std::error_code EC = sys::fs::createUniqueDirectory("unittest", TestDir); + EXPECT_TRUE(!EC); + + SmallString<128> ResponseFilePath; + sys::path::append(ResponseFilePath, TestDir, "test.rsp"); + + std::ofstream ResponseFile(ResponseFilePath.c_str()); + EXPECT_TRUE(ResponseFile.is_open()); + ResponseFile << "-foo" << "\n"; + ResponseFile << "-bar" << "\n"; + ResponseFile.close(); + + // Ensure we expand rsp files after lots of non-rsp arguments starting with @. + constexpr size_t NON_RSP_AT_ARGS = 64; + SmallVector<const char *, 4> Argv = {"test/test"}; + Argv.append(NON_RSP_AT_ARGS, "@non_rsp_at_arg"); + std::string ResponseFileRef = std::string("@") + ResponseFilePath.c_str(); + Argv.push_back(ResponseFileRef.c_str()); + + BumpPtrAllocator A; + StringSaver Saver(A); + bool Res = cl::ExpandResponseFiles(Saver, cl::TokenizeGNUCommandLine, Argv, + false, false); + EXPECT_FALSE(Res); + + // ASSERT instead of EXPECT to prevent potential out-of-bounds access. + ASSERT_EQ(Argv.size(), 1 + NON_RSP_AT_ARGS + 2); + size_t i = 0; + EXPECT_STREQ(Argv[i++], "test/test"); + for (; i < 1 + NON_RSP_AT_ARGS; ++i) + EXPECT_STREQ(Argv[i], "@non_rsp_at_arg"); + EXPECT_STREQ(Argv[i++], "-foo"); + EXPECT_STREQ(Argv[i++], "-bar"); +} + TEST(CommandLineTest, SetDefautValue) { cl::ResetCommandLineParser(); |