From 15fa03547786488d8e8bd14ad0443fb581302388 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 15 Mar 2016 18:20:50 +0000 Subject: [PATCH] ELF: Fix use-after-free problem. Fixes pr26908. This patch is based on Filipe Cabecinhas' patch (http://reviews.llvm.org/D18167) http://reviews.llvm.org/D18169 llvm-svn: 263569 --- lld/ELF/Driver.cpp | 3 ++- lld/ELF/Driver.h | 10 ++++++++-- lld/ELF/DriverUtils.cpp | 13 ++++--------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index de873bb..b7cf7a3 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -170,7 +170,8 @@ static bool hasZOption(opt::InputArgList &Args, StringRef Key) { } void LinkerDriver::main(ArrayRef ArgsArr) { - opt::InputArgList Args = parseArgs(&Alloc, ArgsArr.slice(1)); + ELFOptTable Parser; + opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); if (Args.hasArg(OPT_help)) { printHelp(ArgsArr[0]); return; diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index 33b5580..0437ebf 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -39,8 +39,14 @@ private: }; // Parses command line options. -llvm::opt::InputArgList parseArgs(llvm::BumpPtrAllocator *A, - ArrayRef Args); +class ELFOptTable : public llvm::opt::OptTable { +public: + ELFOptTable(); + llvm::opt::InputArgList parse(ArrayRef Argv); + +private: + llvm::BumpPtrAllocator Alloc; +}; // Create enum with OPT_xxx values for each option in Options.td enum { diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 851166e..f40cfdd 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -46,26 +46,21 @@ static const opt::OptTable::Info infoTable[] = { #undef OPTION }; -class ELFOptTable : public opt::OptTable { -public: - ELFOptTable() : OptTable(infoTable) {} -}; +ELFOptTable::ELFOptTable() : OptTable(infoTable) {} // Parses a given list of options. -opt::InputArgList elf::parseArgs(llvm::BumpPtrAllocator *A, - ArrayRef Argv) { +opt::InputArgList ELFOptTable::parse(ArrayRef Argv) { // Make InputArgList from string vectors. - ELFOptTable Table; unsigned MissingIndex; unsigned MissingCount; // Expand response files. '@' is replaced by the file's contents. SmallVector Vec(Argv.data(), Argv.data() + Argv.size()); - StringSaver Saver(*A); + StringSaver Saver(Alloc); llvm::cl::ExpandResponseFiles(Saver, llvm::cl::TokenizeGNUCommandLine, Vec); // Parse options and then do error checking. - opt::InputArgList Args = Table.ParseArgs(Vec, MissingIndex, MissingCount); + opt::InputArgList Args = this->ParseArgs(Vec, MissingIndex, MissingCount); if (MissingCount) error(Twine("missing arg value for \"") + Args.getArgString(MissingIndex) + "\", expected " + Twine(MissingCount) + -- 2.7.4