summaryrefslogtreecommitdiffstats
path: root/lld/ELF
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-12-21 08:11:49 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-12-21 08:11:49 +0000
commit4fb6e79c65527b5617fe859c4c4a7d232281d2dd (patch)
tree0c7ef2bc0ba115c846271e352aa55453fd796cb7 /lld/ELF
parent86dc60d8d4c7cc720f578e4a18fa2664483bc186 (diff)
downloadbcm5719-llvm-4fb6e79c65527b5617fe859c4c4a7d232281d2dd.tar.gz
bcm5719-llvm-4fb6e79c65527b5617fe859c4c4a7d232281d2dd.zip
[ELF] - Fix use of freed memory.
It was revealed by D27831. If we have linkerscript that includes another one that sets OUTPUT for example: RUN: echo "INCLUDE \"foo.script\"" > %t.script RUN: echo "OUTPUT(\"%t.out\")" > %T/foo.script then we do: void ScriptParser::readInclude() { ... std::unique_ptr<MemoryBuffer> &MB = *MBOrErr; tokenize(MB->getMemBufferRef()); OwningMBs.push_back(std::move(MB)); } void ScriptParser::readOutput() { ... Config->OutputFile = unquote(Tok); ... } Problem is that OwningMBs are destroyed after script parser do its job. So all Toks are dead and Config->OutputFile points to destroyed data. Patch suggests to save all included scripts into using string Saver. Differential revision: https://reviews.llvm.org/D27987 llvm-svn: 290238
Diffstat (limited to 'lld/ELF')
-rw-r--r--lld/ELF/LinkerScript.cpp4
1 files changed, 1 insertions, 3 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 53daaa6743d..3e229b0eaa0 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -1030,7 +1030,6 @@ private:
ScriptConfiguration &Opt = *ScriptConfig;
bool IsUnderSysroot;
- std::vector<std::unique_ptr<MemoryBuffer>> OwningMBs;
};
void ScriptParser::readDynamicList() {
@@ -1180,8 +1179,7 @@ void ScriptParser::readInclude() {
return;
}
std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;
- tokenize(MB->getMemBufferRef());
- OwningMBs.push_back(std::move(MB));
+ tokenize({Saver.save(MB->getBuffer()), unquote(Tok)});
}
void ScriptParser::readOutput() {
OpenPOWER on IntegriCloud