[llvm] r239109 - [Object, MachO] Don't crash on incomplete MachO segment load commands.

Alexey Samsonov vonosmas at gmail.com
Thu Jun 4 15:26:44 PDT 2015


Author: samsonov
Date: Thu Jun  4 17:26:44 2015
New Revision: 239109

URL: http://llvm.org/viewvc/llvm-project?rev=239109&view=rev
Log:
[Object, MachO] Don't crash on incomplete MachO segment load commands.

Report proper error code from MachOObjectFile constructor if we
can't parse another segment load command (we already return a proper
error if segment load command contents is suspicious).

Added:
    llvm/trunk/test/Object/Inputs/macho64-invalid-incomplete-segment-load-command
Modified:
    llvm/trunk/lib/Object/MachOObjectFile.cpp
    llvm/trunk/test/Object/macho-invalid.test

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=239109&r1=239108&r2=239109&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Thu Jun  4 17:26:44 2015
@@ -207,7 +207,10 @@ static std::error_code parseSegmentLoadC
   const unsigned SegmentLoadSize = sizeof(SegmentCmd);
   if (Load.C.cmdsize < SegmentLoadSize)
     return object_error::macho_load_segment_too_small;
-  SegmentCmd S = getStruct<SegmentCmd>(Obj, Load.Ptr);
+  auto SegOrErr = getStructOrErr<SegmentCmd>(Obj, Load.Ptr);
+  if (!SegOrErr)
+    return SegOrErr.getError();
+  SegmentCmd S = SegOrErr.get();
   const unsigned SectionSize =
       Obj->is64Bit() ? sizeof(MachO::section_64) : sizeof(MachO::section);
   if (S.nsects > std::numeric_limits<uint32_t>::max() / SectionSize ||

Added: llvm/trunk/test/Object/Inputs/macho64-invalid-incomplete-segment-load-command
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho64-invalid-incomplete-segment-load-command?rev=239109&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/macho64-invalid-incomplete-segment-load-command (added) and llvm/trunk/test/Object/Inputs/macho64-invalid-incomplete-segment-load-command Thu Jun  4 17:26:44 2015 differ

Modified: llvm/trunk/test/Object/macho-invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/macho-invalid.test?rev=239109&r1=239108&r2=239109&view=diff
==============================================================================
--- llvm/trunk/test/Object/macho-invalid.test (original)
+++ llvm/trunk/test/Object/macho-invalid.test Thu Jun  4 17:26:44 2015
@@ -37,3 +37,6 @@ INVALID-SECTION-IDX-SYMBOL-SEC: getSymbo
 
 RUN: not llvm-objdump -private-headers %p/Inputs/macho-invalid-header 2>&1 | FileCheck -check-prefix INVALID-HEADER %s
 INVALID-HEADER: Invalid data was encountered while parsing the file
+
+RUN: not llvm-objdump -private-headers %p/Inputs/macho64-invalid-incomplete-segment-load-command 2>&1 | FileCheck -check-prefix INCOMPLETE-SEGMENT-LOADC %s
+INCOMPLETE-SEGMENT-LOADC: Invalid data was encountered while parsing the file





More information about the llvm-commits mailing list