Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lld/MachO/InputSection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,9 @@ WordLiteralInputSection::WordLiteralInputSection(const Section &section,
}

uint64_t WordLiteralInputSection::getOffset(uint64_t off) const {
if (off >= data.size())
fatal(toString(this) + ": offset is outside the section");

auto *osec = cast<WordLiteralSection>(parent);
const uintptr_t buf = reinterpret_cast<uintptr_t>(data.data());
switch (sectionType(getFlags())) {
Expand Down
45 changes: 45 additions & 0 deletions lld/test/MachO/invalid/bad-offsets.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
## Test that we properly detect and report out-of-bounds offsets in literal sections.
## We're intentionally testing fatal errors (for malformed input files), and
## fatal errors aren't supported for testing when main is run twice.
# XFAIL: main-run-twice

# REQUIRES: x86
# RUN: rm -rf %t; split-file %s %t

## Test WordLiteralInputSection bounds checking
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/word-literal.s -o %t/word-literal.o
# RUN: not %lld -dylib %t/word-literal.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=WORD

## Test CStringInputSection bounds checking
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/cstring.s -o %t/cstring.o
# RUN: not %lld -dylib %t/cstring.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=CSTRING

# WORD: error: {{.*}}word-literal.o:(__literal4): offset is outside the section
# CSTRING: error: {{.*}}cstring.o:(__cstring): offset is outside the section

#--- word-literal.s
.section __TEXT,__literal4,4byte_literals
L_literal:
.long 0x01020304

.text
.globl _main
_main:
# We use a subtractor expression to force a section relocation. Symbol relocations
# don't trigger the error.
.long L_literal - _main + 4

.subsections_via_symbols

#--- cstring.s
## Create a cstring section with a reference that points past the end
.cstring
L_str:
.asciz "foo"

.text
.globl _main
_main:
.long L_str - _main + 4

.subsections_via_symbols