summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-config
diff options
context:
space:
mode:
authorRichard Diamond <wichard@vitalitystudios.com>2015-11-25 22:49:48 +0000
committerRichard Diamond <wichard@vitalitystudios.com>2015-11-25 22:49:48 +0000
commita62513c5dc1d82625fce96ff7182007c6a2171bf (patch)
treea47440e4b208640ef2ba5484f4299db9bbae2a57 /llvm/tools/llvm-config
parentb6029b7ef449305ac58845e99306b9faa2d240e7 (diff)
downloadbcm5719-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.cpp20
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 << ' ';
OpenPOWER on IntegriCloud