[Lldb-commits] [lldb] r179605 - <rdar://problem/13468295>
Greg Clayton
gclayton at apple.com
Tue Apr 16 09:51:19 PDT 2013
Author: gclayton
Date: Tue Apr 16 11:51:19 2013
New Revision: 179605
URL: http://llvm.org/viewvc/llvm-project?rev=179605&view=rev
Log:
<rdar://problem/13468295>
Show an error message when we have a corrupt mach-o file where the LC_SEGMENT or LC_SEGMENT_64 load command have file offsets or file offsets + sizes that extend beyond the end of the file.
Modified:
lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=179605&r1=179604&r2=179605&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Tue Apr 16 11:51:19 2013
@@ -844,25 +844,36 @@ ObjectFileMachO::ParseSections ()
load_cmd.filesize = m_data.GetAddress(&offset);
if (m_length != 0 && load_cmd.filesize != 0)
{
+ if (load_cmd.fileoff > m_length)
+ {
+ // We have a load command that says it extends past the end of hte file. This is likely
+ // a corrupt file. We don't have any way to return an error condition here (this method
+ // was likely invokved from something like ObjectFile::GetSectionList()) -- all we can do
+ // is null out the SectionList vector and if a process has been set up, dump a message
+ // to stdout. The most common case here is core file debugging with a truncated file.
+ const char *lc_segment_name = load_cmd.cmd == LoadCommandSegment64 ? "LC_SEGMENT_64" : "LC_SEGMENT";
+ GetModule()->ReportError("is a corrupt mach-o file: load command %u %s has a fileoff (0x%" PRIx64 ") that extends beyond the end of the file (0x%" PRIx64 ")",
+ i,
+ lc_segment_name,
+ load_cmd.fileoff,
+ m_length);
+ m_sections_ap->Clear();
+ return 0;
+ }
+
if (load_cmd.fileoff + load_cmd.filesize > m_length)
{
// We have a load command that says it extends past the end of hte file. This is likely
// a corrupt file. We don't have any way to return an error condition here (this method
// was likely invokved from something like ObjectFile::GetSectionList()) -- all we can do
// is null out the SectionList vector and if a process has been set up, dump a message
- // to stdout. The most common case here is core file debugging with a truncated file - and
- // in that case we don't have a Process yet so nothing will be printed. Not really ideal;
- // the ObjectFile needs some way of reporting an error message for methods like GetSectionList
- // which fail.
- ProcessSP process_sp (m_process_wp.lock());
- if (process_sp)
- {
- Stream *s = &process_sp->GetTarget().GetDebugger().GetOutputStream();
- if (s)
- {
- s->Printf ("Corrupt/invalid Mach-O object file -- a load command extends past the end of the file.\n");
- }
- }
+ // to stdout. The most common case here is core file debugging with a truncated file.
+ const char *lc_segment_name = load_cmd.cmd == LoadCommandSegment64 ? "LC_SEGMENT_64" : "LC_SEGMENT";
+ GetModule()->ReportError("is a corrupt mach-o file: load command %u %s has a fileoff + filesize (0x%" PRIx64 ") that extends beyond the end of the file (0x%" PRIx64 ")",
+ i,
+ lc_segment_name,
+ load_cmd.fileoff + load_cmd.filesize,
+ m_length);
m_sections_ap->Clear();
return 0;
}
More information about the lldb-commits
mailing list