[llvm] 5125685 - [llvm-dwp] Fix a possible out of bound access.
Igor Kudrin via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 6 00:32:20 PDT 2020
Author: Igor Kudrin
Date: 2020-04-06T14:31:00+07:00
New Revision: 5125685e915afe4d12961f5b3394918d04d49783
URL: https://github.com/llvm/llvm-project/commit/5125685e915afe4d12961f5b3394918d04d49783
DIFF: https://github.com/llvm/llvm-project/commit/5125685e915afe4d12961f5b3394918d04d49783.diff
LOG: [llvm-dwp] Fix a possible out of bound access.
llvm-dwp did not check section identifiers read from input files.
In the case of an unexpected identifier, the calculated index for
Contributions[] pointed outside the array. This fix avoids the issue
by skipping unsupported identifiers.
Differential Revision: https://reviews.llvm.org/D76543
Added:
llvm/test/tools/llvm-dwp/X86/unknown-section-id.s
Modified:
llvm/tools/llvm-dwp/llvm-dwp.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-dwp/X86/unknown-section-id.s b/llvm/test/tools/llvm-dwp/X86/unknown-section-id.s
new file mode 100644
index 000000000000..384b58da0c6f
--- /dev/null
+++ b/llvm/test/tools/llvm-dwp/X86/unknown-section-id.s
@@ -0,0 +1,138 @@
+## The test checks that llvm-dwp avoids an out of bound access when there is
+## an unknown section identifier in an index section. Without the fix, the test
+## failed when LLVM is built with UBSan.
+## Note that additional sections (.debug_abbrev.dwo, .debug_info.dwo, and
+## .debug_types.dwo) are required to reach the test points in the code.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux-gnu %s -filetype=obj -o %t.dwp
+# RUN: llvm-dwp %t.dwp -o - | \
+# RUN: llvm-dwarfdump -debug-cu-index -debug-tu-index - | \
+# RUN: FileCheck %s
+
+## Check that all known sections are preserved and no data for unknown section
+## identifiers is copied.
+
+# CHECK: .debug_cu_index contents:
+# CHECK-NEXT: version = 2 slots = 2
+# CHECK: Index Signature INFO ABBREV
+# CHECK-NOT: Unknown
+# CHECK: -----
+# CHECK-NEXT: 1 0x1100002222222222 [0x00000000, 0x00000014) [0x00000000, 0x00000009)
+# CHECK-NOT: [
+
+# CHECK: .debug_tu_index contents:
+# CHECK-NEXT: version = 2 slots = 2
+# CHECK: Index Signature TYPES ABBREV
+# CHECK-NOT: Unknown
+# CHECK: -----
+# CHECK-NEXT: 2 0x1100003333333333 [0x00000000, 0x00000019) [0x00000009, 0x00000014)
+# CHECK-NOT: [
+
+.section .debug_abbrev.dwo, "e", @progbits
+.LCUAbbrevBegin:
+ .uleb128 1 # Abbreviation Code
+ .uleb128 0x11 # DW_TAG_compile_unit
+ .byte 0 # DW_CHILDREN_no
+ .uleb128 0x2131 # DW_AT_GNU_dwo_id
+ .uleb128 7 # DW_FORM_data8
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+.LCUAbbrevEnd:
+
+.LTUAbbrevBegin:
+ .uleb128 1 # Abbreviation Code
+ .uleb128 0x41 # DW_TAG_type_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .uleb128 2 # Abbreviation Code
+ .uleb128 0x13 # DW_TAG_structure_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+.LTUAbbrevEnd:
+
+ .section .debug_info.dwo, "e", @progbits
+.LCUBegin:
+ .long .LCUEnd-.LCUVersion # Length of Unit
+.LCUVersion:
+ .short 4 # Version
+ .long 0 # Abbrev offset
+ .byte 8 # Address size
+ .uleb128 1 # Abbrev [1] DW_TAG_compile_unit
+ .quad 0x1100002222222222 # DW_AT_GNU_dwo_id
+.LCUEnd:
+
+ .section .debug_types.dwo, "e", @progbits
+.LTUBegin:
+ .long .LTUEnd-.LTUVersion # Length of Unit
+.LTUVersion:
+ .short 4 # Version
+ .long 0 # Abbrev offset
+ .byte 8 # Address size
+ .quad 0x1100003333333333 # Type signature
+ .long .LTUType-.LTUBegin # Type offset
+ .uleb128 1 # Abbrev [1] DW_TAG_type_unit
+.LTUType:
+ .uleb128 2 # Abbrev [2] DW_TAG_structure_type
+.LTUEnd:
+
+ .section .debug_cu_index, "", @progbits
+## Header:
+ .long 2 # Version
+ .long 4 # Section count
+ .long 1 # Unit count
+ .long 2 # Slot count
+## Hash Table of Signatures:
+ .quad 0x1100002222222222
+ .quad 0
+## Parallel Table of Indexes:
+ .long 1
+ .long 0
+## Table of Section Offsets:
+## Row 0:
+ .long 1 # DW_SECT_INFO
+ .long 3 # DW_SECT_ABBREV
+ .long 0 # Invalid ID, less than DW_SECT_INFO
+ .long 9 # Invalid ID, greater than DW_SECT_MACRO
+## Row 1:
+ .long 0 # Offset in .debug_info.dwo
+ .long 0 # Offset in .debug_abbrev.dwo
+ .long 0
+ .long 0
+## Table of Section Sizes:
+ .long .LCUEnd-.LCUBegin # Size in .debug_info.dwo
+ .long .LCUAbbrevEnd-.LCUAbbrevBegin # Size in .debug_abbrev.dwo
+ .long 1
+ .long 1
+
+ .section .debug_tu_index, "", @progbits
+## Header:
+ .long 2 # Version
+ .long 4 # Section count
+ .long 1 # Unit count
+ .long 2 # Slot count
+## Hash Table of Signatures:
+ .quad 0
+ .quad 0x1100003333333333
+## Parallel Table of Indexes:
+ .long 0
+ .long 1
+## Table of Section Offsets:
+## Row 0:
+ .long 2 # DW_SECT_TYPES
+ .long 3 # DW_SECT_ABBREV
+ .long 0 # Invalid ID, less than DW_SECT_INFO
+ .long 9 # Invalid ID, greater than DW_SECT_MACRO
+## Row 1:
+ .long 0 # Offset in .debug_types.dwo
+ .long .LTUAbbrevBegin-.debug_abbrev.dwo # Offset in .debug_abbrev.dwo
+ .long 0
+ .long 0
+## Table of Section Sizes:
+ .long .LTUEnd-.LTUBegin # Size in .debug_types.dwo
+ .long .LTUAbbrevEnd-.LTUAbbrevBegin # Size in .debug_abbrev.dwo
+ .long 1
+ .long 1
diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp
index 18cd92fcb613..bcc5f3831275 100644
--- a/llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -216,6 +216,10 @@ struct UnitIndexEntry {
StringRef DWPName;
};
+static bool isSupportedSectionKind(DWARFSectionKind Kind) {
+ return Kind != DW_SECT_EXT_unknown;
+}
+
// Convert an internal section identifier into the index to use with
// UnitIndexEntry::Contributions.
static unsigned getContributionIndex(DWARFSectionKind Kind) {
@@ -255,6 +259,8 @@ static void addAllTypesFromDWP(
// Zero out the debug_info contribution
Entry.Contributions[0] = {};
for (auto Kind : TUIndex.getColumnKinds()) {
+ if (!isSupportedSectionKind(Kind))
+ continue;
auto &C = Entry.Contributions[getContributionIndex(Kind)];
C.Offset += I->Offset;
C.Length = I->Length;
@@ -633,6 +639,8 @@ static Error write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
NewEntry.DWOName = ID.DWOName;
NewEntry.DWPName = Input;
for (auto Kind : CUIndex.getColumnKinds()) {
+ if (!isSupportedSectionKind(Kind))
+ continue;
auto &C = NewEntry.Contributions[getContributionIndex(Kind)];
C.Offset += I->Offset;
C.Length = I->Length;
More information about the llvm-commits
mailing list