From 6a0927d8c18d62d131e0ecda945398c3bb0ffa1a Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 26 Feb 2020 21:41:29 +0100 Subject: [PATCH] debug: Fix end-of-stream condition in DWARF parser --- lib/std/dwarf.zig | 10 ++++++---- lib/std/io/seekable_stream.zig | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/std/dwarf.zig b/lib/std/dwarf.zig index f174e38555..32a49b68e0 100644 --- a/lib/std/dwarf.zig +++ b/lib/std/dwarf.zig @@ -417,9 +417,9 @@ pub const DwarfInfo = struct { var s = io.SliceSeekableInStream.init(di.debug_info); var this_unit_offset: u64 = 0; - while (true) { + while (this_unit_offset < try s.seekable_stream.getEndPos()) { s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) { - error.EndOfStream => return, + error.EndOfStream => unreachable, else => return err, }; @@ -445,6 +445,8 @@ pub const DwarfInfo = struct { while ((try s.seekable_stream.getPos()) < next_unit_pos) { const die_obj = (try di.parseDie(&s.stream, abbrev_table, is_64)) orelse continue; + defer die_obj.attrs.deinit(); + const after_die_offset = try s.seekable_stream.getPos(); switch (die_obj.tag_id) { @@ -520,9 +522,9 @@ pub const DwarfInfo = struct { var s = io.SliceSeekableInStream.init(di.debug_info); var this_unit_offset: u64 = 0; - while (true) { + while (this_unit_offset < try s.seekable_stream.getEndPos()) { s.seekable_stream.seekTo(this_unit_offset) catch |err| switch (err) { - error.EndOfStream => return, + error.EndOfStream => unreachable, else => return err, }; diff --git a/lib/std/io/seekable_stream.zig b/lib/std/io/seekable_stream.zig index 48dc31b785..052abbc856 100644 --- a/lib/std/io/seekable_stream.zig +++ b/lib/std/io/seekable_stream.zig @@ -73,7 +73,7 @@ pub const SliceSeekableInStream = struct { fn seekToFn(in_stream: *SeekableInStream, pos: u64) SeekError!void { const self = @fieldParentPtr(Self, "seekable_stream", in_stream); const usize_pos = @intCast(usize, pos); - if (usize_pos >= self.slice.len) return error.EndOfStream; + if (usize_pos > self.slice.len) return error.EndOfStream; self.pos = usize_pos; } @@ -86,7 +86,7 @@ pub const SliceSeekableInStream = struct { self.pos -= abs_amt; } else { const usize_amt = @intCast(usize, amt); - if (self.pos + usize_amt >= self.slice.len) return error.EndOfStream; + if (self.pos + usize_amt > self.slice.len) return error.EndOfStream; self.pos += usize_amt; } }