diff options
| author | Richard Diamond <wichard@vitalitystudios.com> | 2015-11-25 22:49:48 +0000 |
|---|---|---|
| committer | Richard Diamond <wichard@vitalitystudios.com> | 2015-11-25 22:49:48 +0000 |
| commit | a62513c5dc1d82625fce96ff7182007c6a2171bf (patch) | |
| tree | a47440e4b208640ef2ba5484f4299db9bbae2a57 /llvm/tools/llvm-config | |
| parent | b6029b7ef449305ac58845e99306b9faa2d240e7 (diff) | |
| download | bcm5719-llvm-a62513c5dc1d82625fce96ff7182007c6a2171bf.tar.gz bcm5719-llvm-a62513c5dc1d82625fce96ff7182007c6a2171bf.zip | |
Fix a use-after-free in `llvm-config`.
Summary:
This could happen if `GetComponentNames` is true, because `Name` from
`VisitComponent` would reference a stack instance of `std::string` in
`ComputeLibsForComponents`.
Reviewers: beanz
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D14913
llvm-svn: 254108
Diffstat (limited to 'llvm/tools/llvm-config')
| -rw-r--r-- | llvm/tools/llvm-config/llvm-config.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp index d086f4951c1..80f627936d0 100644 --- a/llvm/tools/llvm-config/llvm-config.cpp +++ b/llvm/tools/llvm-config/llvm-config.cpp @@ -56,10 +56,10 @@ using namespace llvm; /// libraries. /// \param GetComponentNames - Get the component names instead of the /// library name. -static void VisitComponent(StringRef Name, +static void VisitComponent(const std::string& Name, const StringMap<AvailableComponent*> &ComponentMap, std::set<AvailableComponent*> &VisitedComponents, - std::vector<StringRef> &RequiredLibs, + std::vector<std::string> &RequiredLibs, bool IncludeNonInstalled, bool GetComponentNames, const std::string *ActiveLibDir, bool *HasMissing) { // Lookup the component. @@ -105,11 +105,11 @@ static void VisitComponent(StringRef Name, /// \param IncludeNonInstalled - Whether non-installed components should be /// reported. /// \param GetComponentNames - True if one would prefer the component names. -static std::vector<StringRef> +static std::vector<std::string> ComputeLibsForComponents(const std::vector<StringRef> &Components, bool IncludeNonInstalled, bool GetComponentNames, const std::string *ActiveLibDir, bool *HasMissing) { - std::vector<StringRef> RequiredLibs; + std::vector<std::string> RequiredLibs; std::set<AvailableComponent *> VisitedComponents; // Build a map of component names to information. @@ -195,8 +195,8 @@ std::string GetExecutablePath(const char *Argv0) { /// \brief Expand the semi-colon delimited LLVM_DYLIB_COMPONENTS into /// the full list of components. -std::vector<StringRef> GetAllDyLibComponents(const bool IsInDevelopmentTree, - const bool GetComponentNames) { +std::vector<std::string> GetAllDyLibComponents(const bool IsInDevelopmentTree, + const bool GetComponentNames) { std::vector<StringRef> DyLibComponents; StringRef DyLibComponentsStr(LLVM_DYLIB_COMPONENTS); @@ -453,7 +453,7 @@ int main(int argc, char **argv) { /// If there are missing static archives and a dylib was /// built, print LLVM_DYLIB_COMPONENTS instead of everything /// in the manifest. - std::vector<StringRef> Components; + std::vector<std::string> Components; for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) { // Only include non-installed components when in a development tree. if (!AvailableComponents[j].IsInstalled && !IsInDevelopmentTree) @@ -526,14 +526,14 @@ int main(int argc, char **argv) { // Construct the list of all the required libraries. bool HasMissing = false; - std::vector<StringRef> RequiredLibs = + std::vector<std::string> RequiredLibs = ComputeLibsForComponents(Components, /*IncludeNonInstalled=*/IsInDevelopmentTree, false, &ActiveLibDir, &HasMissing); if (PrintSharedMode) { std::unordered_set<std::string> FullDyLibComponents; - std::vector<StringRef> DyLibComponents = + std::vector<std::string> DyLibComponents = GetAllDyLibComponents(IsInDevelopmentTree, false); for (auto &Component : DyLibComponents) { @@ -585,7 +585,7 @@ int main(int argc, char **argv) { PrintForLib(DyLibName, true); } else { for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) { - StringRef Lib = RequiredLibs[i]; + auto Lib = RequiredLibs[i]; if (i) OS << ' '; |

