Skip to content

Commit 6a89355

Browse files
committed
Log a warning if an extended opcode has an invalid length
1 parent 40b5602 commit 6a89355

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

src/LibObjectFile/DiagnosticId.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public enum DiagnosticId
109109
DWARF_ERR_InvalidNullUnitForAddressRangeTable = 2016,
110110
DWARF_ERR_InvalidParentUnitForAddressRangeTable = 2017,
111111
DWARF_ERR_InvalidParentForDIE = 2018,
112+
DWARF_WRN_InvalidExtendedOpCodeLength = 2019,
112113

113114
}
114115
}

src/LibObjectFile/Dwarf/DwarfLineProgramTable.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -431,10 +431,11 @@ protected override void Read(DwarfReader reader)
431431
break;
432432
case 0:
433433
var sizeOfExtended = reader.ReadULEB128();
434+
var lengthOffset = reader.Offset;
434435
var endOffset = reader.Offset + sizeOfExtended;
435-
while (reader.Offset < endOffset)
436+
bool hasValidOpCode = true;
437+
if (reader.Offset < endOffset)
436438
{
437-
bool isValidSubOpCode = true;
438439
var sub_opcode = reader.ReadU8();
439440

440441
// extended opcode
@@ -489,7 +490,6 @@ protected override void Read(DwarfReader reader)
489490
log.WriteLine($" {intFileNameCount + 1}\t{fileDirectoryIndex}\t{debugFileName.Time}\t{debugFileName.Size,-7}\t{fileName}");
490491
log.WriteLine();
491492
}
492-
493493
break;
494494
case DwarfNative.DW_LNE_set_discriminator: // DWARF 4
495495
state.Discriminator = reader.ReadULEB128();
@@ -503,16 +503,19 @@ protected override void Read(DwarfReader reader)
503503
{
504504
log.WriteLine($"Unknown opcode");
505505
}
506-
isValidSubOpCode = false;
506+
507+
hasValidOpCode = false;
507508
// TODO: Add support for pluggable handling of extensions
508509
reader.Diagnostics.Warning(DiagnosticId.DWARF_WRN_UnsupportedLineExtendedCode, $"Unsupported line extended opcode 0x{sub_opcode:x}");
509510
break;
510511
}
511512

512-
if (!isValidSubOpCode)
513-
{
514-
break;
515-
}
513+
}
514+
515+
// Log a warning if the end offset doesn't match what we are expecting
516+
if (hasValidOpCode && reader.Offset != endOffset)
517+
{
518+
reader.Diagnostics.Warning(DiagnosticId.DWARF_WRN_InvalidExtendedOpCodeLength, $"Invalid length {sizeOfExtended} at offset 0x{lengthOffset:x}");
516519
}
517520

518521
reader.Offset = endOffset;

0 commit comments

Comments
 (0)