| ... | @@ -622,9 +622,10 @@ pub const NativeTargetInfo = struct { | ... | @@ -622,9 +622,10 @@ pub const NativeTargetInfo = struct { |
| 622 | const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); | 622 | const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); |
| 623 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); | 623 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); |
| 624 | if (p_filesz > result.dynamic_linker.buffer.len) return error.NameTooLong; | 624 | if (p_filesz > result.dynamic_linker.buffer.len) return error.NameTooLong; |
| 625 | _ = try preadMin(file, result.dynamic_linker.buffer[0..p_filesz], p_offset, p_filesz); | 625 | const filesz = @intCast(usize, p_filesz); |
| 626 | // PT_INTERP includes a null byte in p_filesz. | 626 | _ = try preadMin(file, result.dynamic_linker.buffer[0..filesz], p_offset, filesz); |
| 627 | const len = p_filesz - 1; | 627 | // PT_INTERP includes a null byte in filesz. |
| | 628 | const len = filesz - 1; |
| 628 | // dynamic_linker.max_byte is "max", not "len". | 629 | // dynamic_linker.max_byte is "max", not "len". |
| 629 | // We know it will fit in u8 because we check against dynamic_linker.buffer.len above. | 630 | // We know it will fit in u8 because we check against dynamic_linker.buffer.len above. |
| 630 | result.dynamic_linker.max_byte = @intCast(u8, len - 1); | 631 | result.dynamic_linker.max_byte = @intCast(u8, len - 1); |
| ... | @@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct { | ... | @@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct { |
| 645 | { | 646 | { |
| 646 | var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); | 647 | var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); |
| 647 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); | 648 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); |
| 648 | const dyn_size: u64 = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); | 649 | const dyn_size: usize = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); |
| 649 | const dyn_num = p_filesz / dyn_size; | 650 | const dyn_num = p_filesz / dyn_size; |
| 650 | var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined; | 651 | var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined; |
| 651 | var dyn_i: usize = 0; | 652 | var dyn_i: usize = 0; |
| ... | @@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct { | ... | @@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct { |
| 751 | const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len); | 752 | const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len); |
| 752 | const strtab = strtab_buf[0..strtab_read_len]; | 753 | const strtab = strtab_buf[0..strtab_read_len]; |
| 753 | // TODO this pointer cast should not be necessary | 754 | // TODO this pointer cast should not be necessary |
| 754 | const rpath_list = mem.spanZ(@ptrCast([*:0]u8, strtab[rpoff..].ptr)); | 755 | const rpoff_usize = std.math.cast(usize, rpoff) catch |err| switch (err) { |
| | 756 | error.Overflow => return error.InvalidElfFile, |
| | 757 | }; |
| | 758 | const rpath_list = mem.spanZ(@ptrCast([*:0]u8, strtab[rpoff_usize..].ptr)); |
| 755 | var it = mem.tokenize(rpath_list, ":"); | 759 | var it = mem.tokenize(rpath_list, ":"); |
| 756 | while (it.next()) |rpath| { | 760 | while (it.next()) |rpath| { |
| 757 | var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) { | 761 | var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) { |
| ... | @@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct { | ... | @@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct { |
| 811 | } | 815 | } |
| 812 | | 816 | |
| 813 | fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize { | 817 | fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize { |
| 814 | var i: u64 = 0; | 818 | var i: usize = 0; |
| 815 | while (i < min_read_len) { | 819 | while (i < min_read_len) { |
| 816 | const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) { | 820 | const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) { |
| 817 | error.OperationAborted => unreachable, // Windows-only | 821 | error.OperationAborted => unreachable, // Windows-only |