[PATCH] D121398: Return an error when dsymutil might produce an invalid mach-o file.
Greg Clayton via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 10 11:31:19 PST 2022
clayborg created this revision.
clayborg added reviewers: JDevlieghere, aprantl.
Herald added a project: All.
clayborg requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
64 bit mach-o files have sections that only have 32 bit file offsets. If dsymutil tries to produce an invalid mach-o file, then error out with a good error string.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D121398
Files:
llvm/tools/dsymutil/MachOUtils.cpp
Index: llvm/tools/dsymutil/MachOUtils.cpp
===================================================================
--- llvm/tools/dsymutil/MachOUtils.cpp
+++ llvm/tools/dsymutil/MachOUtils.cpp
@@ -304,7 +304,7 @@
}
// Write the __DWARF segment load command to the output file.
-static void createDwarfSegment(uint64_t VMAddr, uint64_t FileOffset,
+static bool createDwarfSegment(uint64_t VMAddr, uint64_t FileOffset,
uint64_t FileSize, unsigned NumSections,
MCAsmLayout &Layout, MachObjectWriter &Writer) {
Writer.writeSegmentLoadCommand("__DWARF", NumSections, VMAddr,
@@ -321,12 +321,15 @@
if (Align > 1) {
VMAddr = alignTo(VMAddr, Align);
FileOffset = alignTo(FileOffset, Align);
+ if (FileOffset > UINT32_MAX)
+ return error("section " + Sec->getName() + "'s file offset exceeds 4GB and will produce an invalid mach-o file");
}
Writer.writeSection(Layout, *Sec, VMAddr, FileOffset, 0, 0, 0);
FileOffset += Layout.getSectionAddressSize(Sec);
VMAddr += Layout.getSectionAddressSize(Sec);
}
+ return true;
}
static bool isExecutable(const object::MachOObjectFile &Obj) {
@@ -564,8 +567,9 @@
}
// Write the load command for the __DWARF segment.
- createDwarfSegment(DwarfVMAddr, DwarfSegmentStart, DwarfSegmentSize,
- NumDwarfSections, Layout, Writer);
+ if (!createDwarfSegment(DwarfVMAddr, DwarfSegmentStart, DwarfSegmentSize,
+ NumDwarfSections, Layout, Writer))
+ return false;
assert(OutFile.tell() == LoadCommandSize + HeaderSize);
OutFile.write_zeros(SymtabStart - (LoadCommandSize + HeaderSize));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121398.414448.patch
Type: text/x-patch
Size: 1698 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220310/ca5675a0/attachment.bin>
More information about the llvm-commits
mailing list