diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-09-04 08:47:17 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-09-10 08:29:31 -0400 |
| commit | 778519bb0d883eed7b2a4e89ae7db68c15271ee3 (patch) | |
| tree | f505364c4cc25e421a1fa6f8e927c4a0f81bb478 /src | |
| parent | 90075345519f165a0164c52b62b78453068c6ce6 (diff) | |
| download | zig-778519bb0d883eed7b2a4e89ae7db68c15271ee3.tar.gz zig-778519bb0d883eed7b2a4e89ae7db68c15271ee3.zip | |
Dwarf: fix missing padding before incrementally updated entries
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Dwarf.zig | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index bff33ecf14..26aafd8092 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -847,10 +847,11 @@ const Entry = struct { unit.len -| (unit.header_len + unit.trailer_len); if (entry_ptr.off + len > end) { if (entry_ptr.next.unwrap()) |next_entry| { - if (entry_ptr.prev.unwrap()) |prev_entry| - unit.getEntry(prev_entry).next = entry_ptr.next - else - unit.first = entry_ptr.next; + if (entry_ptr.prev.unwrap()) |prev_entry| { + const prev_entry_ptr = unit.getEntry(prev_entry); + prev_entry_ptr.next = entry_ptr.next; + try prev_entry_ptr.pad(unit, sec, dwarf); + } else unit.first = entry_ptr.next; const next_entry_ptr = unit.getEntry(next_entry); const entry = next_entry_ptr.prev; next_entry_ptr.prev = entry_ptr.prev; @@ -860,6 +861,7 @@ const Entry = struct { entry_ptr.next = .none; entry_ptr.off = last_entry_ptr.off + sec.padToIdeal(last_entry_ptr.len); unit.last = entry; + try last_entry_ptr.pad(unit, sec, dwarf); } try unit.resize(sec, dwarf, 0, @intCast(unit.header_len + entry_ptr.off + sec.padToIdeal(len) + unit.trailer_len)); } |
