Skip to content

Commit

Permalink
[Object] Remove check for BIND_OPCODE_DONE/REBASE_OPCODE_DONE.
Browse files Browse the repository at this point in the history
BIND_OPCODE_DONE/REBASE_OPCODE_DONE may appear at the end of the opcode array,
but they are not required to. The linker only adds them as padding to align the
opcodes to pointer size.

This fixes rdar://problem/31285560.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299104 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
ributzka committed Mar 30, 2017
1 parent 5fd6afd commit 2bca52a
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 18 deletions.
20 changes: 8 additions & 12 deletions lib/Object/MachOObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2780,12 +2780,10 @@ void MachORebaseEntry::moveNext() {
--RemainingLoopCount;
return;
}
if (Ptr >= Opcodes.end()) {
if (Opcodes.begin() != Opcodes.end() && Done != true) {
*E = malformedError("missing REBASE_OPCODE_DONE at end of opcodes");
moveToEnd();
return;
}
// REBASE_OPCODE_DONE is only used for padding if we are not aligned to
// pointer size. Therefore it is possible to reach the end without ever having
// seen REBASE_OPCODE_DONE.
if (Ptr == Opcodes.end()) {
Done = true;
return;
}
Expand Down Expand Up @@ -3164,12 +3162,10 @@ void MachOBindEntry::moveNext() {
--RemainingLoopCount;
return;
}
if (Ptr >= Opcodes.end()) {
if (Opcodes.begin() != Opcodes.end() && Done != true) {
*E = malformedError("missing BIND_OPCODE_DONE at end of opcodes");
moveToEnd();
return;
}
// BIND_OPCODE_DONE is only used for padding if we are not aligned to
// pointer size. Therefore it is possible to reach the end without ever having
// seen BIND_OPCODE_DONE.
if (Ptr == Opcodes.end()) {
Done = true;
return;
}
Expand Down
Binary file not shown.
Binary file not shown.
6 changes: 0 additions & 6 deletions test/tools/llvm-objdump/macho-bad-bind.test
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,6 @@ WEAK-BIND-SET-DYLIB-ORDINAL-ULEB: macho-weak-bind-set-dylib-ordinal-uleb': trunc
RUN: not llvm-objdump -macho -weak-bind %p/Inputs/macho-weak-bind-set-dylib-special-imm 2>&1 | FileCheck -check-prefix WEAK-BIND-SET-DYLIB-SPECIAL-IMM %s
WEAK-BIND-SET-DYLIB-SPECIAL-IMM: macho-weak-bind-set-dylib-special-imm': truncated or malformed object (BIND_OPCODE_SET_DYLIB_SPECIAL_IMM not allowed in weak bind table for opcode at: 0x2)

RUN: not llvm-objdump -macho -bind %p/Inputs/macho-bind-missing-done 2>&1 | FileCheck -check-prefix BIND-MISSING-DONE %s
BIND-MISSING-DONE: macho-bind-missing-done': truncated or malformed object (missing BIND_OPCODE_DONE at end of opcodes)

RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-set-type-imm 2>&1 | FileCheck -check-prefix REBASE-SET-TYPE-IMM %s
REBASE-SET-TYPE-IMM: macho-rebase-set-type-imm': truncated or malformed object (for REBASE_OPCODE_SET_TYPE_IMM bad bind type: 5 for opcode at: 0x0)

Expand Down Expand Up @@ -102,6 +99,3 @@ REBASE-ULEB-TIMES-SKIPPING-ULEB: macho-rebase-uleb-times-skipping-uleb': truncat

RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-bad-opcode-value 2>&1 | FileCheck -check-prefix REBASE-BAD-OPCODE-VALUE %s
REBASE-BAD-OPCODE-VALUE: macho-rebase-bad-opcode-value': truncated or malformed object (bad rebase info (bad opcode value 0xD0 for opcode at: 0x4)

RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-missing-done 2>&1 | FileCheck -check-prefix REBASE-MISSING-DONE %s
REBASE-MISSING-DONE: macho-rebase-missing-done': truncated or malformed object (missing REBASE_OPCODE_DONE at end of opcodes)

0 comments on commit 2bca52a

Please sign in to comment.