@@ -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