@@ -348,17 +348,11 @@ pub const ExceptionFrameHeader = struct {
348
348
};
349
349
}
350
350
351
- fn isValidPtr (
352
- self : ExceptionFrameHeader ,
353
- comptime T : type ,
354
- ptr : usize ,
355
- ma : * MemoryAccessor ,
356
- eh_frame_len : ? usize ,
357
- ) bool {
351
+ fn isValidPtr (self : ExceptionFrameHeader , comptime T : type , ptr : usize , eh_frame_len : ? usize ) bool {
358
352
if (eh_frame_len ) | len | {
359
353
return ptr >= self .eh_frame_ptr and ptr <= self .eh_frame_ptr + len - @sizeOf (T );
360
354
} else {
361
- return ma .load (T , ptr ) != null ;
355
+ return MemoryAccessor .load (T , ptr ) != null ;
362
356
}
363
357
}
364
358
@@ -369,7 +363,6 @@ pub const ExceptionFrameHeader = struct {
369
363
/// If `eh_frame_len` is provided, then these checks can be skipped.
370
364
pub fn findEntry (
371
365
self : ExceptionFrameHeader ,
372
- ma : * MemoryAccessor ,
373
366
eh_frame_len : ? usize ,
374
367
eh_frame_hdr_ptr : usize ,
375
368
pc : usize ,
@@ -430,15 +423,15 @@ pub const ExceptionFrameHeader = struct {
430
423
.endian = native_endian ,
431
424
};
432
425
433
- const fde_entry_header = try EntryHeader .read (& eh_frame_fbr , if ( eh_frame_len == null ) ma else null , .eh_frame );
434
- if (fde_entry_header .entry_bytes .len > 0 and ! self .isValidPtr (u8 , @intFromPtr (& fde_entry_header .entry_bytes [fde_entry_header .entry_bytes .len - 1 ]), ma , eh_frame_len )) return bad ();
426
+ const fde_entry_header = try EntryHeader .read (& eh_frame_fbr , eh_frame_len == null , .eh_frame );
427
+ if (fde_entry_header .entry_bytes .len > 0 and ! self .isValidPtr (u8 , @intFromPtr (& fde_entry_header .entry_bytes [fde_entry_header .entry_bytes .len - 1 ]), eh_frame_len )) return bad ();
435
428
if (fde_entry_header .type != .fde ) return bad ();
436
429
437
430
// CIEs always come before FDEs (the offset is a subtraction), so we can assume this memory is readable
438
431
const cie_offset = fde_entry_header .type .fde ;
439
432
try eh_frame_fbr .seekTo (cie_offset );
440
- const cie_entry_header = try EntryHeader .read (& eh_frame_fbr , if ( eh_frame_len == null ) ma else null , .eh_frame );
441
- if (cie_entry_header .entry_bytes .len > 0 and ! self .isValidPtr (u8 , @intFromPtr (& cie_entry_header .entry_bytes [cie_entry_header .entry_bytes .len - 1 ]), ma , eh_frame_len )) return bad ();
433
+ const cie_entry_header = try EntryHeader .read (& eh_frame_fbr , eh_frame_len == null , .eh_frame );
434
+ if (cie_entry_header .entry_bytes .len > 0 and ! self .isValidPtr (u8 , @intFromPtr (& cie_entry_header .entry_bytes [cie_entry_header .entry_bytes .len - 1 ]), eh_frame_len )) return bad ();
442
435
if (cie_entry_header .type != .cie ) return bad ();
443
436
444
437
cie .* = try CommonInformationEntry .parse (
@@ -485,15 +478,11 @@ pub const EntryHeader = struct {
485
478
486
479
/// Reads a header for either an FDE or a CIE, then advances the fbr to the position after the trailing structure.
487
480
/// `fbr` must be a FixedBufferReader backed by either the .eh_frame or .debug_frame sections.
488
- pub fn read (
489
- fbr : * FixedBufferReader ,
490
- opt_ma : ? * MemoryAccessor ,
491
- dwarf_section : Section.Id ,
492
- ) ! EntryHeader {
481
+ pub fn read (fbr : * FixedBufferReader , checked : bool , dwarf_section : Section.Id ) ! EntryHeader {
493
482
assert (dwarf_section == .eh_frame or dwarf_section == .debug_frame );
494
483
495
484
const length_offset = fbr .pos ;
496
- const unit_header = try readUnitHeader (fbr , opt_ma );
485
+ const unit_header = try readUnitHeader (fbr , checked );
497
486
const unit_length = cast (usize , unit_header .unit_length ) orelse return bad ();
498
487
if (unit_length == 0 ) return .{
499
488
.length_offset = length_offset ,
@@ -505,8 +494,8 @@ pub const EntryHeader = struct {
505
494
const end_offset = start_offset + unit_length ;
506
495
defer fbr .pos = end_offset ;
507
496
508
- const id = try if (opt_ma ) | ma |
509
- fbr .readAddressChecked (unit_header .format , ma )
497
+ const id = try if (checked )
498
+ fbr .readAddressChecked (unit_header .format )
510
499
else
511
500
fbr .readAddress (unit_header .format );
512
501
const entry_bytes = fbr .buf [fbr .pos .. end_offset ];
@@ -855,7 +844,7 @@ fn scanAllFunctions(di: *Dwarf, allocator: Allocator) ScanError!void {
855
844
while (this_unit_offset < fbr .buf .len ) {
856
845
try fbr .seekTo (this_unit_offset );
857
846
858
- const unit_header = try readUnitHeader (& fbr , null );
847
+ const unit_header = try readUnitHeader (& fbr , false );
859
848
if (unit_header .unit_length == 0 ) return ;
860
849
const next_offset = unit_header .header_length + unit_header .unit_length ;
861
850
@@ -1044,7 +1033,7 @@ fn scanAllCompileUnits(di: *Dwarf, allocator: Allocator) ScanError!void {
1044
1033
while (this_unit_offset < fbr .buf .len ) {
1045
1034
try fbr .seekTo (this_unit_offset );
1046
1035
1047
- const unit_header = try readUnitHeader (& fbr , null );
1036
+ const unit_header = try readUnitHeader (& fbr , false );
1048
1037
if (unit_header .unit_length == 0 ) return ;
1049
1038
const next_offset = unit_header .header_length + unit_header .unit_length ;
1050
1039
@@ -1426,7 +1415,7 @@ fn runLineNumberProgram(d: *Dwarf, gpa: Allocator, compile_unit: *CompileUnit) !
1426
1415
};
1427
1416
try fbr .seekTo (line_info_offset );
1428
1417
1429
- const unit_header = try readUnitHeader (& fbr , null );
1418
+ const unit_header = try readUnitHeader (& fbr , false );
1430
1419
if (unit_header .unit_length == 0 ) return missing ();
1431
1420
1432
1421
const next_offset = unit_header .header_length + unit_header .unit_length ;
@@ -1814,7 +1803,7 @@ pub fn scanCieFdeInfo(di: *Dwarf, allocator: Allocator, base_address: usize) !vo
1814
1803
if (di .section (frame_section )) | section_data | {
1815
1804
var fbr : FixedBufferReader = .{ .buf = section_data , .endian = di .endian };
1816
1805
while (fbr .pos < fbr .buf .len ) {
1817
- const entry_header = try EntryHeader .read (& fbr , null , frame_section );
1806
+ const entry_header = try EntryHeader .read (& fbr , false , frame_section );
1818
1807
switch (entry_header .type ) {
1819
1808
.cie = > {
1820
1809
const cie = try CommonInformationEntry .parse (
@@ -1987,8 +1976,8 @@ const UnitHeader = struct {
1987
1976
unit_length : u64 ,
1988
1977
};
1989
1978
1990
- fn readUnitHeader (fbr : * FixedBufferReader , opt_ma : ? * MemoryAccessor ) ScanError ! UnitHeader {
1991
- return switch (try if (opt_ma ) | ma | fbr .readIntChecked (u32 , ma ) else fbr .readInt (u32 )) {
1979
+ fn readUnitHeader (fbr : * FixedBufferReader , checked : bool ) ScanError ! UnitHeader {
1980
+ return switch (try if (checked ) fbr .readIntChecked (u32 ) else fbr .readInt (u32 )) {
1992
1981
0... 0xfffffff0 - 1 = > | unit_length | .{
1993
1982
.format = .@"32" ,
1994
1983
.header_length = 4 ,
@@ -1998,7 +1987,7 @@ fn readUnitHeader(fbr: *FixedBufferReader, opt_ma: ?*MemoryAccessor) ScanError!U
1998
1987
0xffffffff = > .{
1999
1988
.format = .@"64" ,
2000
1989
.header_length = 12 ,
2001
- .unit_length = try if (opt_ma ) | ma | fbr .readIntChecked (u64 , ma ) else fbr .readInt (u64 ),
1990
+ .unit_length = try if (checked ) fbr .readIntChecked (u64 ) else fbr .readInt (u64 ),
2002
1991
},
2003
1992
};
2004
1993
}
0 commit comments