diff options
| -rw-r--r-- | src/link/Elf/Archive.zig | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/link/Elf/Archive.zig b/src/link/Elf/Archive.zig index a2f83dda5a..dff8d09afa 100644 --- a/src/link/Elf/Archive.zig +++ b/src/link/Elf/Archive.zig @@ -21,18 +21,17 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil const handle = elf_file.fileHandle(handle_index); const size = (try handle.stat()).size; - const reader = handle.reader(); - _ = try reader.readBytesNoEof(elf.ARMAG.len); - var pos: usize = elf.ARMAG.len; while (true) { if (pos >= size) break; - if (!mem.isAligned(pos, 2)) { - try handle.seekBy(1); - pos += 1; - } + if (!mem.isAligned(pos, 2)) pos += 1; - const hdr = try reader.readStruct(elf.ar_hdr); + var hdr_buffer: [@sizeOf(elf.ar_hdr)]u8 = undefined; + { + const amt = try handle.preadAll(&hdr_buffer, pos); + if (amt != @sizeOf(elf.ar_hdr)) return error.InputOutput; + } + const hdr = @as(*align(1) const elf.ar_hdr, @ptrCast(&hdr_buffer)).*; pos += @sizeOf(elf.ar_hdr); if (!mem.eql(u8, &hdr.ar_fmag, elf.ARFMAG)) { @@ -44,7 +43,6 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil const obj_size = try hdr.size(); defer { - _ = handle.seekBy(obj_size) catch {}; pos += obj_size; } |
