From: Kevin Enderby Date: Tue, 3 May 2016 23:13:50 +0000 (+0000) Subject: Produce another specific error message for a malformed Mach-O file when a load X-Git-Tag: llvmorg-3.9.0-rc1~7059 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8e3ab0c5675d0e51b5643146fd634cf9608b6f4;p=platform%2Fupstream%2Fllvm.git Produce another specific error message for a malformed Mach-O file when a load command has a size less than 8 bytes. I think the existing test case in test/Object/macho-invalid.test for macho64-invalid-too-small-load-command was trying to test for this but that test case triggered a different error given how it was constructed. So I constructed a new test case that would trigger this specific error. I also changed the error message to be consistent with the other malformed Mach-O file error messages. I also removed object_error::macho_small_load_command from Object/Error.h as it is not needed and can just use object_error::parse_failed and let the error message string distinguish the error. llvm-svn: 268463 --- diff --git a/llvm/include/llvm/Object/Error.h b/llvm/include/llvm/Object/Error.h index d29c2dc..c0902dd 100644 --- a/llvm/include/llvm/Object/Error.h +++ b/llvm/include/llvm/Object/Error.h @@ -34,7 +34,6 @@ enum class object_error { string_table_non_null_end, invalid_section_index, bitcode_section_not_found, - macho_small_load_command, macho_load_segment_too_many_sections, macho_load_segment_too_small, }; diff --git a/llvm/lib/Object/Error.cpp b/llvm/lib/Object/Error.cpp index fae4394..297418c 100644 --- a/llvm/lib/Object/Error.cpp +++ b/llvm/lib/Object/Error.cpp @@ -47,8 +47,6 @@ std::string _object_error_category::message(int EV) const { return "Invalid section index"; case object_error::bitcode_section_not_found: return "Bitcode section not found in object file"; - case object_error::macho_small_load_command: - return "Mach-O load command with size < 8 bytes"; case object_error::macho_load_segment_too_many_sections: return "Mach-O segment load command contains too many sections"; case object_error::macho_load_segment_too_small: diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 744603a..ad29d00 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -177,11 +177,13 @@ static uint32_t getSectionFlags(const MachOObjectFile *O, } static Expected -getLoadCommandInfo(const MachOObjectFile *Obj, const char *Ptr) { +getLoadCommandInfo(const MachOObjectFile *Obj, const char *Ptr, + uint32_t LoadCommandIndex) { if (auto CmdOrErr = getStructOrErr(Obj, Ptr)) { if (CmdOrErr->cmdsize < 8) - return malformedError(*Obj, "Mach-O load command with size < 8 bytes", - object_error::macho_small_load_command); + return malformedError(*Obj, Twine("truncated or malformed object (load " + "command ") + Twine(LoadCommandIndex) + + Twine(" with size less than 8 bytes)")); return MachOObjectFile::LoadCommandInfo({Ptr, *CmdOrErr}); } else return CmdOrErr.takeError(); @@ -195,7 +197,7 @@ getFirstLoadCommandInfo(const MachOObjectFile *Obj) { return malformedError(*Obj, "truncated or malformed object (load command " "0 extends past the end all load commands in the " "file)"); - return getLoadCommandInfo(Obj, getPtr(Obj, HeaderSize)); + return getLoadCommandInfo(Obj, getPtr(Obj, HeaderSize), 0); } static Expected @@ -209,7 +211,7 @@ getNextLoadCommandInfo(const MachOObjectFile *Obj, uint32_t LoadCommandIndex, "(load command ") + Twine(LoadCommandIndex + 1) + Twine(" extends past the end all load commands in the " "file)")); - return getLoadCommandInfo(Obj, L.Ptr + L.C.cmdsize); + return getLoadCommandInfo(Obj, L.Ptr + L.C.cmdsize, LoadCommandIndex + 1); } template diff --git a/llvm/test/Object/Inputs/macho64-invalid-too-small-load-command.1 b/llvm/test/Object/Inputs/macho64-invalid-too-small-load-command.1 new file mode 100644 index 0000000..cb8886ed Binary files /dev/null and b/llvm/test/Object/Inputs/macho64-invalid-too-small-load-command.1 differ diff --git a/llvm/test/Object/macho-invalid.test b/llvm/test/Object/macho-invalid.test index 92b1807..4ddea18 100644 --- a/llvm/test/Object/macho-invalid.test +++ b/llvm/test/Object/macho-invalid.test @@ -19,6 +19,10 @@ RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho64-invalid-too-smal RUN: | FileCheck -check-prefix SMALL-LOADC-SIZE %s SMALL-LOADC-SIZE: truncated or malformed object (load commands extend past the end of the file) +RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho64-invalid-too-small-load-command.1 2>&1 \ +RUN: | FileCheck -check-prefix SMALL-LOADC-SIZE-1 %s +SMALL-LOADC-SIZE-1: truncated or malformed object (load command 1 with size less than 8 bytes) + RUN: not llvm-objdump -private-headers %p/Inputs/macho-invalid-too-small-segment-load-command 2>&1 \ RUN: | FileCheck -check-prefix SMALL-SEGLOADC-SIZE %s RUN: not llvm-objdump -private-headers %p/Inputs/macho64-invalid-too-small-segment-load-command 2>&1 \