From 8a0bc44b712701af03f04d7afdc1a01731a53180 Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Thu, 22 May 2014 20:05:43 +0000 Subject: [PATCH] [mach-o] Fix so that mach-o semantic errors return an error rather than assert llvm-svn: 209469 --- .../MachO/MachONormalizedFileToAtoms.cpp | 19 ++++++++++------ .../ReaderWriter/MachO/MachONormalizedFileYAML.cpp | 4 +++- lld/test/mach-o/parse-literals-error.yaml | 25 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 lld/test/mach-o/parse-literals-error.yaml diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp index d40321b..769cb39 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp @@ -107,8 +107,8 @@ static void processUndefindeSymbol(MachOFile &file, const Symbol &sym, } } -static void processSection(MachOFile &file, const Section §ion, - bool copyRefs) { +static error_code processSection(MachOFile &file, const Section §ion, + bool copyRefs) { unsigned offset = 0; switch (section.type) { case llvm::MachO::S_REGULAR: @@ -128,7 +128,8 @@ static void processSection(MachOFile &file, const Section §ion, } break; case llvm::MachO::S_4BYTE_LITERALS: - assert((section.content.size() % 4) == 0); + if ((section.content.size() % 4) != 0) + return llvm::make_error_code(llvm::errc::executable_format_error); for (size_t i = 0, e = section.content.size(); i != e; i += 4) { ArrayRef byteContent = section.content.slice(offset, 4); file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit, @@ -137,7 +138,8 @@ static void processSection(MachOFile &file, const Section §ion, } break; case llvm::MachO::S_8BYTE_LITERALS: - assert((section.content.size() % 8) == 0); + if ((section.content.size() % 8) != 0) + return llvm::make_error_code(llvm::errc::executable_format_error); for (size_t i = 0, e = section.content.size(); i != e; i += 8) { ArrayRef byteContent = section.content.slice(offset, 8); file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit, @@ -146,7 +148,8 @@ static void processSection(MachOFile &file, const Section §ion, } break; case llvm::MachO::S_16BYTE_LITERALS: - assert((section.content.size() % 16) == 0); + if ((section.content.size() % 16) != 0) + return llvm::make_error_code(llvm::errc::executable_format_error); for (size_t i = 0, e = section.content.size(); i != e; i += 16) { ArrayRef byteContent = section.content.slice(offset, 16); file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit, @@ -155,9 +158,10 @@ static void processSection(MachOFile &file, const Section §ion, } break; default: - llvm_unreachable("mach-o section type not supported"); + llvm_unreachable("mach-o section type not supported yet"); break; } + return error_code::success(); } static ErrorOr> @@ -179,7 +183,8 @@ normalizedObjectToAtoms(const NormalizedFile &normalizedFile, StringRef path, } // Create atoms from sections that don't have symbols. for (auto § : normalizedFile.sections) { - processSection(*file, sect, copyRefs); + if (error_code ec = processSection(*file, sect, copyRefs)) + return ec; } return std::unique_ptr(std::move(file)); diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp index 691a1bc..4ce61fc 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp @@ -659,8 +659,10 @@ bool MachOYamlIOTaggedDocumentHandler::handledDocTag(llvm::yaml::IO &io, std::unique_ptr f = std::move(foe.get()); file = f.release(); return true; + } else { + io.setError(foe.getError().message()); + return false; } - return false; } diff --git a/lld/test/mach-o/parse-literals-error.yaml b/lld/test/mach-o/parse-literals-error.yaml new file mode 100644 index 0000000..be21d6e --- /dev/null +++ b/lld/test/mach-o/parse-literals-error.yaml @@ -0,0 +1,25 @@ +# RUN: not lld -flavor darwin -arch x86_64 -r -print_atoms %s -o %t 2> %t.err +# RUN: FileCheck %s < %t.err +# +# Test for error if literal section is not correct size mulitple. +# + +--- !mach-o +arch: x86_64 +file-type: MH_OBJECT +flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] +has-UUID: false +OS: unknown +sections: + - segment: __TEXT + section: __literal8 + type: S_8BYTE_LITERALS + attributes: [ ] + alignment: 0 + address: 0x0000000000000120 + content: [ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D ] +... + +# CHECK: error: + -- 2.7.4