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.get(); 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 = DysymtabOrErr.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,7 +779,10 @@ 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); + auto CommandOrErr = getStructOrErr(Obj, Load.Ptr); + if (!CommandOrErr) + return CommandOrErr.takeError(); + MachO::dylinker_command D = CommandOrErr.get(); if (D.name < sizeof(MachO::dylinker_command)) return malformedError("load command " + Twine(LoadCommandIndex) + " " + CmdName + " name.offset field too small, not past " @@ -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 = BVCOrErr.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 = ThreadCommandOrErr.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 HintsOrErr.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);