summaryrefslogtreecommitdiffstats
path: root/clang/tools
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2018-03-19 16:13:43 +0000
committerSerge Pavlov <sepavloff@gmail.com>2018-03-19 16:13:43 +0000
commit826e833121d0f84a4ddf5f089e61bb8d3d79ef0e (patch)
tree2f7600f1dfd6a74a8ac860c4fa9bcf0d6d62a4b6 /clang/tools
parent4b54e5fc386e5aa62725efe893d8ac9b9ee1dd01 (diff)
downloadbcm5719-llvm-826e833121d0f84a4ddf5f089e61bb8d3d79ef0e.tar.gz
bcm5719-llvm-826e833121d0f84a4ddf5f089e61bb8d3d79ef0e.zip
[Driver] Avoid invalidated iterator in insertTargetAndModeArgs
Doing an .insert() can potentially invalidate iterators by reallocating the vector's storage. When all the stars align just right, this causes segfaults or glibc aborts. Gentoo Linux bug (crashes while building Chromium): https://bugs.gentoo.org/650082. Patch by Hector Martin! Differential Revision: https://reviews.llvm.org/D44607 llvm-svn: 327863
Diffstat (limited to 'clang/tools')
-rw-r--r--clang/tools/driver/driver.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp
index 611bff233e4..72d56a72873 100644
--- a/clang/tools/driver/driver.cpp
+++ b/clang/tools/driver/driver.cpp
@@ -212,20 +212,21 @@ static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
// Put target and mode arguments at the start of argument list so that
// arguments specified in command line could override them. Avoid putting
// them at index 0, as an option like '-cc1' must remain the first.
- auto InsertionPoint = ArgVector.begin();
- if (InsertionPoint != ArgVector.end())
+ int InsertionPoint = 0;
+ if (ArgVector.size() > 0)
++InsertionPoint;
if (NameParts.DriverMode) {
// Add the mode flag to the arguments.
- ArgVector.insert(InsertionPoint,
+ ArgVector.insert(ArgVector.begin() + InsertionPoint,
GetStableCStr(SavedStrings, NameParts.DriverMode));
}
if (NameParts.TargetIsValid) {
const char *arr[] = {"-target", GetStableCStr(SavedStrings,
NameParts.TargetPrefix)};
- ArgVector.insert(InsertionPoint, std::begin(arr), std::end(arr));
+ ArgVector.insert(ArgVector.begin() + InsertionPoint,
+ std::begin(arr), std::end(arr));
}
}
OpenPOWER on IntegriCloud