diff options
author | Greg Clayton <gclayton@apple.com> | 2015-10-28 20:49:34 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2015-10-28 20:49:34 +0000 |
commit | 8f265f701a0fbd45f6e6d8ad84cc537c346bf4fb (patch) | |
tree | a68fd6800766192b8c7541ba6079425efb65477b /lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | |
parent | d10e6280cb1fe1a71b584d4c85e98180548b2166 (diff) | |
download | bcm5719-llvm-8f265f701a0fbd45f6e6d8ad84cc537c346bf4fb.tar.gz bcm5719-llvm-8f265f701a0fbd45f6e6d8ad84cc537c346bf4fb.zip |
Don't crash when opening a fuzzed mach-o file that has bad dyld trie data.
<rdar://problem/21991784>
llvm-svn: 251555
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 48d37bf32a0..625418c508a 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -2068,7 +2068,7 @@ struct TrieEntryWithOffset } }; -static void +static bool ParseTrieEntries (DataExtractor &data, lldb::offset_t offset, const bool is_arm, @@ -2077,7 +2077,7 @@ ParseTrieEntries (DataExtractor &data, std::vector<TrieEntryWithOffset>& output) { if (!data.ValidOffset(offset)) - return; + return true; const uint64_t terminalSize = data.GetULEB128(&offset); lldb::offset_t children_offset = offset + terminalSize; @@ -2128,19 +2128,27 @@ ParseTrieEntries (DataExtractor &data, const uint8_t childrenCount = data.GetU8(&children_offset); for (uint8_t i=0; i < childrenCount; ++i) { - nameSlices.push_back(data.GetCStr(&children_offset)); + const char *cstr = data.GetCStr(&children_offset); + if (cstr) + nameSlices.push_back(llvm::StringRef(cstr)); + else + return false; // Corrupt data lldb::offset_t childNodeOffset = data.GetULEB128(&children_offset); if (childNodeOffset) { - ParseTrieEntries(data, - childNodeOffset, - is_arm, - nameSlices, - resolver_addresses, - output); + if (!ParseTrieEntries(data, + childNodeOffset, + is_arm, + nameSlices, + resolver_addresses, + output)) + { + return false; + } } nameSlices.pop_back(); } + return true; } size_t |