Index: llvm/test/tools/llvm-dwarfdump/X86/lc_malformed.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-dwarfdump/X86/lc_malformed.test @@ -0,0 +1,39 @@ +# RUN: yaml2obj %s | not llvm-dwarfdump --uuid - 2>&1 | FileCheck %s +# CHECK: load command 0 filesize field in LC_SEGMENT_64 greater than vmsize field + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 24 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: '' + vmaddr: 0 + vmsize: 80 + fileoff: 384 + filesize: 81 + maxprot: 7 + initprot: 7 + nsects: 1 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + size: 15 + offset: 0x00000180 + align: 4 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 +... Index: llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp =================================================================== --- llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -263,13 +263,31 @@ /// @} //===----------------------------------------------------------------------===// -static void error(StringRef Prefix, std::error_code EC) { +static void error(StringRef Prefix, std::error_code EC, + llvm::Optional Msg = {}) { if (!EC) return; - WithColor::error() << Prefix << ": " << EC.message() << "\n"; + WithColor::error() << Prefix << ": " << (Msg ? *Msg : EC.message()) << '\n'; exit(1); } +static void error(StringRef Prefix, Error Err) { + std::error_code EC; + llvm::Optional Msg; + handleAllErrors( + std::move(Err), + [&](const GenericBinaryError &E) { + Msg = E.getMessage(); + EC = E.convertToErrorCode(); + }, + [&](const StringError &E) { + Msg = E.getMessage(); + EC = E.convertToErrorCode(); + }, + [&](const ECError &E) { EC = E.convertToErrorCode(); }); + error(Prefix, EC, Msg); +} + static DIDumpOptions getDumpOpts(DWARFContext &C) { DIDumpOptions DumpOpts; DumpOpts.DumpType = DumpType; @@ -508,13 +526,13 @@ Error Err = Error::success(); for (auto Child : Arch.children(Err)) { auto BuffOrErr = Child.getMemoryBufferRef(); - error(Filename, errorToErrorCode(BuffOrErr.takeError())); + error(Filename, BuffOrErr.takeError()); auto NameOrErr = Child.getName(); - error(Filename, errorToErrorCode(NameOrErr.takeError())); + error(Filename, NameOrErr.takeError()); std::string Name = (Filename + "(" + NameOrErr.get() + ")").str(); Result &= handleBuffer(Name, BuffOrErr.get(), HandleObj, OS); } - error(Filename, errorToErrorCode(std::move(Err))); + error(Filename, std::move(Err)); return Result; } @@ -522,7 +540,7 @@ static bool handleBuffer(StringRef Filename, MemoryBufferRef Buffer, HandlerFn HandleObj, raw_ostream &OS) { Expected> BinOrErr = object::createBinary(Buffer); - error(Filename, errorToErrorCode(BinOrErr.takeError())); + error(Filename, BinOrErr.takeError()); bool Result = true; auto RecoverableErrorHandler = [&](Error E) { @@ -553,7 +571,7 @@ } else consumeError(MachOOrErr.takeError()); if (auto ArchiveOrErr = ObjForArch.getAsArchive()) { - error(ObjName, errorToErrorCode(ArchiveOrErr.takeError())); + error(ObjName, ArchiveOrErr.takeError()); if (!handleArchive(ObjName, *ArchiveOrErr.get(), HandleObj, OS)) Result = false; continue;