diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-05 15:15:22 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-05 15:15:22 +0000 |
commit | f16c2bb320f4d5b33dfaf8df8865f547e6d66005 (patch) | |
tree | 551e576e9809d1729da4aaadc72b33fa1d5fb8bb /lib/Object/MachOObjectFile.cpp | |
parent | 332edeb1dc9e6aed5229091bb56a914e78f177c2 (diff) |
Don't fetch pointers from a InMemoryStruct.
InMemoryStruct is extremely dangerous as it returns data from an internal
buffer when the endiannes doesn't match. This should fix the tests on big
endian hosts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178875 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/MachOObjectFile.cpp')
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 6501df9fb9..9ab3599e2d 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -481,8 +481,7 @@ static StringRef parseSegmentOrSectionName(const char *P) { return StringRef(P, 16); } -error_code MachOObjectFile::getSectionName(DataRefImpl DRI, - StringRef &Result) const { +ArrayRef<char> MachOObjectFile::getSectionRawName(DataRefImpl DRI) const { if (is64BitLoadCommand(MachOObj.get(), DRI)) { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) + @@ -490,7 +489,7 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI, StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64)); const macho::Section64 *sec = reinterpret_cast<const macho::Section64*>(Data.data()); - Result = parseSegmentOrSectionName(sec->Name); + return ArrayRef<char>(sec->Name, 16); } else { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) + @@ -498,13 +497,19 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI, StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section)); const macho::Section *sec = reinterpret_cast<const macho::Section*>(Data.data()); - Result = parseSegmentOrSectionName(sec->Name); + return ArrayRef<char>(sec->Name, 16); } +} + +error_code MachOObjectFile::getSectionName(DataRefImpl DRI, + StringRef &Result) const { + ArrayRef<char> Raw = getSectionRawName(DRI); + Result = parseSegmentOrSectionName(Raw.data()); return object_error::success; } -error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec, - StringRef &Res) const { +ArrayRef<char> +MachOObjectFile::getSectionRawFinalSegmentName(DataRefImpl Sec) const { if (is64BitLoadCommand(MachOObj.get(), Sec)) { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a); unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) + @@ -512,7 +517,7 @@ error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec, StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64)); const macho::Section64 *sec = reinterpret_cast<const macho::Section64*>(Data.data()); - Res = parseSegmentOrSectionName(sec->SegmentName); + return ArrayRef<char>(sec->SegmentName, 16); } else { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a); unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) + @@ -520,9 +525,13 @@ error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec, StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section)); const macho::Section *sec = reinterpret_cast<const macho::Section*>(Data.data()); - Res = parseSegmentOrSectionName(sec->SegmentName); + return ArrayRef<char>(sec->SegmentName); } - return object_error::success; +} + +StringRef MachOObjectFile::getSectionFinalSegmentName(DataRefImpl DRI) const { + ArrayRef<char> Raw = getSectionRawFinalSegmentName(DRI); + return parseSegmentOrSectionName(Raw.data()); } error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI, |