authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-02-26 21:41:29+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-02-26 21:02:54-05:00
log6a0927d8c18d62d131e0ecda945398c3bb0ffa1a
treee76b03bbefa2a77f7c746a0e3dfa31bc2906d0a9
parentfd1eade4ca02b125b1a2ecea564f32af6a683248

debug: Fix end-of-stream condition in DWARF parser


2 files changed, 8 insertions(+), 6 deletions(-)

lib/std/dwarf.zig+6-4
...@@ -417,9 +417,9 @@ pub const DwarfInfo = struct {...@@ -417,9 +417,9 @@ pub const DwarfInfo = struct {
417 var s = io.SliceSeekableInStream.init(di.debug_info);417 var s = io.SliceSeekableInStream.init(di.debug_info);
418 var this_unit_offset: u64 = 0;418 var this_unit_offset: u64 = 0;
419419
420 while (true) {420 while (this_unit_offset < try s.seekable_stream.getEndPos()) {
421 s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) {421 s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) {
422 error.EndOfStream => return,422 error.EndOfStream => unreachable,
423 else => return err,423 else => return err,
424 };424 };
425425
...@@ -445,6 +445,8 @@ pub const DwarfInfo = struct {...@@ -445,6 +445,8 @@ pub const DwarfInfo = struct {
445445
446 while ((try s.seekable_stream.getPos()) < next_unit_pos) {446 while ((try s.seekable_stream.getPos()) < next_unit_pos) {
447 const die_obj = (try di.parseDie(&s.stream, abbrev_table, is_64)) orelse continue;447 const die_obj = (try di.parseDie(&s.stream, abbrev_table, is_64)) orelse continue;
448 defer die_obj.attrs.deinit();
449
448 const after_die_offset = try s.seekable_stream.getPos();450 const after_die_offset = try s.seekable_stream.getPos();
449451
450 switch (die_obj.tag_id) {452 switch (die_obj.tag_id) {
...@@ -520,9 +522,9 @@ pub const DwarfInfo = struct {...@@ -520,9 +522,9 @@ pub const DwarfInfo = struct {
520 var s = io.SliceSeekableInStream.init(di.debug_info);522 var s = io.SliceSeekableInStream.init(di.debug_info);
521 var this_unit_offset: u64 = 0;523 var this_unit_offset: u64 = 0;
522524
523 while (true) {525 while (this_unit_offset < try s.seekable_stream.getEndPos()) {
524 s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) {526 s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) {
525 error.EndOfStream => return,527 error.EndOfStream => unreachable,
526 else => return err,528 else => return err,
527 };529 };
528530
lib/std/io/seekable_stream.zig+2-2
...@@ -73,7 +73,7 @@ pub const SliceSeekableInStream = struct {...@@ -73,7 +73,7 @@ pub const SliceSeekableInStream = struct {
73 fn seekToFn(in_stream: *SeekableInStream, pos: u64) SeekError!void {73 fn seekToFn(in_stream: *SeekableInStream, pos: u64) SeekError!void {
74 const self = @fieldParentPtr(Self, "seekable_stream", in_stream);74 const self = @fieldParentPtr(Self, "seekable_stream", in_stream);
75 const usize_pos = @intCast(usize, pos);75 const usize_pos = @intCast(usize, pos);
76 if (usize_pos >= self.slice.len) return error.EndOfStream;76 if (usize_pos > self.slice.len) return error.EndOfStream;
77 self.pos = usize_pos;77 self.pos = usize_pos;
78 }78 }
7979
...@@ -86,7 +86,7 @@ pub const SliceSeekableInStream = struct {...@@ -86,7 +86,7 @@ pub const SliceSeekableInStream = struct {
86 self.pos -= abs_amt;86 self.pos -= abs_amt;
87 } else {87 } else {
88 const usize_amt = @intCast(usize, amt);88 const usize_amt = @intCast(usize, amt);
89 if (self.pos + usize_amt >= self.slice.len) return error.EndOfStream;89 if (self.pos + usize_amt > self.slice.len) return error.EndOfStream;
90 self.pos += usize_amt;90 self.pos += usize_amt;
91 }91 }
92 }92 }