Skip to content

Commit a77eae9

Browse files
committed
Make dsymutil more robust when parsing load commands.
rdar://problem/45883463 llvm-svn: 346815
1 parent a139564 commit a77eae9

File tree

3 files changed

+20
-15
lines changed

3 files changed

+20
-15
lines changed
Binary file not shown.

llvm/test/tools/dsymutil/X86/lc_build_version.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ CHECK-NEXT: platform: 1
88
CHECK-NEXT: minos: 658944
99
CHECK-NEXT: sdk: 658944
1010
CHECK-NEXT: ntools: 0
11-
CHECK-NEXT: - cmd
11+
CHECK-NEXT: - cmd: LC_BUILD_VERSION

llvm/tools/dsymutil/MachOUtils.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -374,23 +374,28 @@ bool generateDsymCompanion(const DebugMap &DM, MCStreamer &MS,
374374

375375
// Get LC_UUID and LC_BUILD_VERSION.
376376
MachO::uuid_command UUIDCmd;
377-
MachO::build_version_command BuildVersionCmd;
377+
SmallVector<MachO::build_version_command, 2> BuildVersionCmd;
378378
memset(&UUIDCmd, 0, sizeof(UUIDCmd));
379-
memset(&BuildVersionCmd, 0, sizeof(BuildVersionCmd));
380379
for (auto &LCI : InputBinary.load_commands()) {
381380
switch (LCI.C.cmd) {
382381
case MachO::LC_UUID:
382+
if (UUIDCmd.cmd)
383+
return error("Binary contains more than one UUID");
383384
UUIDCmd = InputBinary.getUuidCommand(LCI);
384385
++NumLoadCommands;
385-
LoadCommandSize += sizeof(MachO::uuid_command);
386+
LoadCommandSize += sizeof(UUIDCmd);
386387
break;
387-
case MachO::LC_BUILD_VERSION:
388-
BuildVersionCmd = InputBinary.getBuildVersionLoadCommand(LCI);
388+
case MachO::LC_BUILD_VERSION: {
389+
MachO::build_version_command Cmd;
390+
memset(&Cmd, 0, sizeof(Cmd));
391+
Cmd = InputBinary.getBuildVersionLoadCommand(LCI);
389392
++NumLoadCommands;
390-
LoadCommandSize += sizeof(MachO::build_version_command);
393+
LoadCommandSize += sizeof(Cmd);
391394
// LLDB doesn't care about the build tools for now.
392-
BuildVersionCmd.ntools = 0;
395+
Cmd.ntools = 0;
396+
BuildVersionCmd.push_back(Cmd);
393397
break;
398+
}
394399
default:
395400
break;
396401
}
@@ -463,13 +468,13 @@ bool generateDsymCompanion(const DebugMap &DM, MCStreamer &MS,
463468
OutFile.write(reinterpret_cast<const char *>(UUIDCmd.uuid), 16);
464469
assert(OutFile.tell() == HeaderSize + sizeof(UUIDCmd));
465470
}
466-
if (BuildVersionCmd.cmd != 0) {
467-
Writer.W.write<uint32_t>(BuildVersionCmd.cmd);
468-
Writer.W.write<uint32_t>(sizeof(BuildVersionCmd));
469-
Writer.W.write<uint32_t>(BuildVersionCmd.platform);
470-
Writer.W.write<uint32_t>(BuildVersionCmd.minos);
471-
Writer.W.write<uint32_t>(BuildVersionCmd.sdk);
472-
Writer.W.write<uint32_t>(BuildVersionCmd.ntools);
471+
for (auto Cmd : BuildVersionCmd) {
472+
Writer.W.write<uint32_t>(Cmd.cmd);
473+
Writer.W.write<uint32_t>(sizeof(Cmd));
474+
Writer.W.write<uint32_t>(Cmd.platform);
475+
Writer.W.write<uint32_t>(Cmd.minos);
476+
Writer.W.write<uint32_t>(Cmd.sdk);
477+
Writer.W.write<uint32_t>(Cmd.ntools);
473478
}
474479

475480
assert(SymtabCmd.cmd && "No symbol table.");

0 commit comments

Comments
 (0)