1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[DWARF] Use deque in place of SmallVector to fix use-after-free issue

Summary: SmallVector's elements are moved when resizing and cause use-after-free.

Reviewers: probinson, dblaikie

Subscribers: JDevlieghere, llvm-commits

Differential Revision: https://reviews.llvm.org/D49702

llvm-svn: 337772
This commit is contained in:
Fangrui Song 2018-07-23 23:27:45 +00:00
parent e049b173d1
commit 372413c6d8

View File

@ -48,6 +48,7 @@
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cstdint>
#include <deque>
#include <map>
#include <string>
#include <utility>
@ -1248,7 +1249,9 @@ class DWARFObjInMemory final : public DWARFObject {
StringRef TUIndexSection;
StringRef LineStringSection;
SmallVector<SmallString<32>, 4> UncompressedSections;
// A deque holding section data whose iterators are not invalidated when
// new decompressed sections are inserted at the end.
std::deque<SmallString<0>> UncompressedSections;
StringRef *mapSectionToMember(StringRef Name) {
if (DWARFSection *Sec = mapNameToDWARFSection(Name))
@ -1286,11 +1289,11 @@ class DWARFObjInMemory final : public DWARFObject {
if (!Decompressor)
return Decompressor.takeError();
SmallString<32> Out;
SmallString<0> Out;
if (auto Err = Decompressor->resizeAndDecompress(Out))
return Err;
UncompressedSections.emplace_back(std::move(Out));
UncompressedSections.push_back(std::move(Out));
Data = UncompressedSections.back();
return Error::success();