diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -291,7 +291,11 @@ for (unsigned J = 0; J < S.nsects; ++J) { const char *Sec = getSectionPtr(Obj, Load, J); Sections.push_back(Sec); - Section s = getStruct
(Obj, Sec); + auto SectionOrErr = getStructOrErr
(Obj, Sec) + if (!SectionOrErr) + return SectionOrErr.takeError(); + + Section s = SectionOrErr.get(); if (Obj.getHeader().filetype != MachO::MH_DYLIB_STUB && Obj.getHeader().filetype != MachO::MH_DSYM && s.flags != MachO::S_ZEROFILL && @@ -401,8 +405,10 @@ " LC_SYMTAB cmdsize too small"); if (*SymtabLoadCmd != nullptr) return malformedError("more than one LC_SYMTAB command"); - MachO::symtab_command Symtab = - getStruct(Obj, Load.Ptr); + auto SymtabOrErr = getStructOrErr(Obj, Load.Ptr); + if (!SymtabOrErr) + return SymtabOrErr.takeError(); + MachO::symtab_command Symtab = SymtabOrErr.takeError(); if (Symtab.cmdsize != sizeof(MachO::symtab_command)) return malformedError("LC_SYMTAB command " + Twine(LoadCommandIndex) + " has incorrect cmdsize"); @@ -457,8 +463,11 @@ " LC_DYSYMTAB cmdsize too small"); if (*DysymtabLoadCmd != nullptr) return malformedError("more than one LC_DYSYMTAB command"); - MachO::dysymtab_command Dysymtab = - getStruct(Obj, Load.Ptr); + auto DysymtabOrErr = + getStructOrErr(Obj, Load.Ptr); + if (!DysymtabOrErr) + return DysymtabOrErr.takeError(); + MachO::dysymtab_command Dysymtab = DysymtabOrError.get(); if (Dysymtab.cmdsize != sizeof(MachO::dysymtab_command)) return malformedError("LC_DYSYMTAB command " + Twine(LoadCommandIndex) + " has incorrect cmdsize"); @@ -588,8 +597,11 @@ CmdName + " cmdsize too small"); if (*LoadCmd != nullptr) return malformedError("more than one " + Twine(CmdName) + " command"); - MachO::linkedit_data_command LinkData = - getStruct(Obj, Load.Ptr); + auto LinkDataOrError = + getStructOrErr(Obj, Load.Ptr); + if (!LinkDataOrError) + return LinkDataOrError.takeError(); + MachO::linkedit_data_command LinkData = LinkDataOrError.get(); if (LinkData.cmdsize != sizeof(MachO::linkedit_data_command)) return malformedError(Twine(CmdName) + " command " + Twine(LoadCommandIndex) + " has incorrect cmdsize"); @@ -623,8 +635,11 @@ if (*LoadCmd != nullptr) return malformedError("more than one LC_DYLD_INFO and or LC_DYLD_INFO_ONLY " "command"); - MachO::dyld_info_command DyldInfo = - getStruct(Obj, Load.Ptr); + auto DyldInfoOrErr = + getStructOrErr(Obj, Load.Ptr); + if (!DyldInfoOrErr) + return DyldInfoOrErr.takeError(); + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); if (DyldInfo.cmdsize != sizeof(MachO::dyld_info_command)) return malformedError(Twine(CmdName) + " command " + Twine(LoadCommandIndex) + " has incorrect cmdsize"); @@ -714,7 +729,11 @@ if (Load.C.cmdsize < sizeof(MachO::dylib_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " cmdsize too small"); - MachO::dylib_command D = getStruct(Obj, Load.Ptr); + auto CommandOrErr = getStructOrErr(Obj, Load.Ptr); + if (!CommandOrErr) + return CommandOrErr.takeError(); + + MachO::dylib_command D = CommandOrErr.get(); if (D.dylib.name < sizeof(MachO::dylib_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " name.offset field too small, not past " @@ -760,23 +779,26 @@ if (Load.C.cmdsize < sizeof(MachO::dylinker_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " cmdsize too small"); - MachO::dylinker_command D = getStruct(Obj, Load.Ptr); - if (D.name < sizeof(MachO::dylinker_command)) + auto CommandOrErr = getStructOrErr(Obj, Load.Ptr); + if (!CommandOrErr) + return CommandOrErr.takeError(); + MachO::dylinker_command Command = CommandOrErr.get(); + if (Command.name < sizeof(MachO::dylinker_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " name.offset field too small, not past " "the end of the dylinker_command struct"); - if (D.name >= D.cmdsize) + if (Command.name >= Command.cmdsize) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " name.offset field extends past the end " "of the load command"); // Make sure there is a null between the starting offset of the name and - // the end of the load command. + // the end of the load command uint32_t i; const char *P = (const char *)Load.Ptr; - for (i = D.name; i < D.cmdsize; i++) + for (i = Command.name; i < Command.cmdsize; i++) if (P[i] == '\0') break; - if (i >= D.cmdsize) + if (i >= Command.cmdsize) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " dyld name extends past the end of the " "load command"); @@ -805,7 +827,10 @@ if (Load.C.cmdsize != sizeof(MachO::note_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " LC_NOTE has incorrect cmdsize"); - MachO::note_command Nt = getStruct(Obj, Load.Ptr); + auto NoteCmdOrErr = getStructOrErr(Obj, Load.Ptr); + if (!NoteCmdOrErr) + return NoteCmdOrErr.takeError(); + MachO::note_command Nt = NoteCmdOrErr.get(); uint64_t FileSize = Obj.getData().size(); if (Nt.offset > FileSize) return malformedError("offset field of LC_NOTE command " + @@ -828,8 +853,11 @@ const MachOObjectFile::LoadCommandInfo &Load, SmallVectorImpl &BuildTools, uint32_t LoadCommandIndex) { - MachO::build_version_command BVC = - getStruct(Obj, Load.Ptr); + auto BVCOrErr = + getStructOrErr(Obj, Load.Ptr); + if (!BVCOrErr) + return BVCOrErr.takeError(): + MachO::build_version_command BVC = BVCOrError.get(); if (Load.C.cmdsize != sizeof(MachO::build_version_command) + BVC.ntools * sizeof(MachO::build_tool_version)) @@ -850,7 +878,10 @@ if (Load.C.cmdsize < sizeof(MachO::rpath_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " LC_RPATH cmdsize too small"); - MachO::rpath_command R = getStruct(Obj, Load.Ptr); + auto ROrErr = getStructOrErr(Obj, Load.Ptr); + if (!ROrErr) + return ROrErr.takeError(); + MachO::rpath_command R = ROrErr.get(): if (R.path < sizeof(MachO::rpath_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " LC_RPATH path.offset field too small, not past " @@ -903,8 +934,10 @@ if (Load.C.cmdsize < sizeof(MachO::linker_option_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " LC_LINKER_OPTION cmdsize too small"); - MachO::linker_option_command L = - getStruct(Obj, Load.Ptr); + auto LinkOptionOrErr = getStructOrErr(Obj, Load.Ptr); + if (!LinkOptionOrErr) + return LinkOptionOrErr.takeError(); + MachO::linker_option_command L = LinkOptionOrErr.get(); // Make sure the count of strings is correct. const char *string = (const char *)Load.Ptr + sizeof(struct MachO::linker_option_command); @@ -968,8 +1001,11 @@ if (Load.C.cmdsize < sizeof(MachO::thread_command)) return malformedError("load command " + Twine(LoadCommandIndex) + CmdName + " cmdsize too small"); - MachO::thread_command T = - getStruct(Obj, Load.Ptr); + auto ThreadCommandOrErr = + getStructOrErr(Obj, Load.Ptr); + if (!ThreadCommandOrErr) + return ThreadCommandOrErr.takeError(); + MachO::thread_command T = ThreadCommandOrError.get(); const char *state = Load.Ptr + sizeof(MachO::thread_command); const char *end = Load.Ptr + T.cmdsize; uint32_t nflavor = 0; @@ -1160,8 +1196,10 @@ " LC_TWOLEVEL_HINTS has incorrect cmdsize"); if (*LoadCmd != nullptr) return malformedError("more than one LC_TWOLEVEL_HINTS command"); - MachO::twolevel_hints_command Hints = - getStruct(Obj, Load.Ptr); + auto HintsOrErr = getStructOrErr(Obj, Load.Ptr); + if(!HintsOrErr) + return HintsOrError.takeError(); + MachO::twolevel_hints_command Hints = HintsOrErr.get() uint64_t FileSize = Obj.getData().size(); if (Hints.offset > FileSize) return malformedError("offset field of LC_TWOLEVEL_HINTS command " + @@ -2396,8 +2434,11 @@ // all the Libraries. if (LibrariesShortNames.size() == 0) { for (unsigned i = 0; i < Libraries.size(); i++) { - MachO::dylib_command D = - getStruct(*this, Libraries[i]); + auto CommandOrErr = + getStructOrErr(*this, Libraries[i]); + if (!CommandOrErr) + return object_error::parse_failed; + MachO::dylib_command D = CommandOrErr.get(): if (D.dylib.name >= D.cmdsize) return object_error::parse_failed; const char *P = (const char *)(Libraries[i]) + D.dylib.name; @@ -4491,8 +4532,11 @@ if (!DyldInfoLoadCmd) return None; - MachO::dyld_info_command DyldInfo = - getStruct(*this, DyldInfoLoadCmd); + auto DyldInfoOrErr = + getStructOrErr(*this, DyldInfoLoadCmd); + if (!DyldInfoOrErr) + return None; + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); const uint8_t *Ptr = reinterpret_cast(getPtr(*this, DyldInfo.rebase_off)); return makeArrayRef(Ptr, DyldInfo.rebase_size); @@ -4502,8 +4546,11 @@ if (!DyldInfoLoadCmd) return None; - MachO::dyld_info_command DyldInfo = - getStruct(*this, DyldInfoLoadCmd); + auto DyldInfoOrErr = + getStructOrErr(*this, DyldInfoLoadCmd); + if (!DyldInfoOrErr) + return None; + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); const uint8_t *Ptr = reinterpret_cast(getPtr(*this, DyldInfo.bind_off)); return makeArrayRef(Ptr, DyldInfo.bind_size); @@ -4513,8 +4560,11 @@ if (!DyldInfoLoadCmd) return None; - MachO::dyld_info_command DyldInfo = - getStruct(*this, DyldInfoLoadCmd); + auto DyldInfoOrErr = + getStructOrErr(*this, DyldInfoLoadCmd); + if (!DyldInfoOrErr) + return None; + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); const uint8_t *Ptr = reinterpret_cast(getPtr(*this, DyldInfo.weak_bind_off)); return makeArrayRef(Ptr, DyldInfo.weak_bind_size); @@ -4524,8 +4574,11 @@ if (!DyldInfoLoadCmd) return None; - MachO::dyld_info_command DyldInfo = - getStruct(*this, DyldInfoLoadCmd); + auto DyldInfoOrErr = + getStructOrErr(*this, DyldInfoLoadCmd); + if (!DyldInfoOrErr) + return None; + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); const uint8_t *Ptr = reinterpret_cast(getPtr(*this, DyldInfo.lazy_bind_off)); return makeArrayRef(Ptr, DyldInfo.lazy_bind_size); @@ -4535,8 +4588,11 @@ if (!DyldInfoLoadCmd) return None; - MachO::dyld_info_command DyldInfo = - getStruct(*this, DyldInfoLoadCmd); + auto DyldInfoOrErr = + getStructOrErr(*this, DyldInfoLoadCmd); + if (!DyldInfoOrErr) + return None; + MachO::dyld_info_command DyldInfo = DyldInfoOrErr.get(); const uint8_t *Ptr = reinterpret_cast(getPtr(*this, DyldInfo.export_off)); return makeArrayRef(Ptr, DyldInfo.export_size); diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -567,9 +567,9 @@ // This function handles the high level operations of GNU objcopy including // handling command line options. It's important to outline certain properties // we expect to hold of the command line operations. Any operation that "keeps" -// should keep regardless of a remove. Additionally any removal should respect +// should keep regardless of a remove. Additionally any removal should respecte // any previous removals. Lastly whether or not something is removed shouldn't -// depend a) on the order the options occur in or b) on some opaque priority +// depend a) on the order the options occur in or b) on som opaque priority // system. The only priority is that keeps/copies overrule removes. static Error handleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader, ElfType OutputElfType) { diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -8,8 +8,8 @@ #include "llvm-objcopy.h" #include "Buffer.h" -#include "COFF/COFFObjcopy.h" #include "CopyConfig.h" +#include "COFF/COFFObjcopy.h" #include "ELF/ELFObjcopy.h" #include "MachO/MachOObjcopy.h" @@ -53,7 +53,7 @@ StringRef ToolName; LLVM_ATTRIBUTE_NORETURN void error(Twine Message) { - WithColor::error(errs(), ToolName) << Message << ".\n"; + WithColor::error(errs(), ToolName) << Message << "\n"; errs().flush(); exit(1); } @@ -146,7 +146,7 @@ return macho::executeObjcopyOnBinary(Config, *MachOBinary, Out); else return createStringError(object_error::invalid_file_type, - "Unsupported object file format"); + "unsupported object file format"); } static Error executeObjcopyOnArchive(const CopyConfig &Config,