mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
std.elf: fix panic while parsing header
When parsing an invalid (e.g., corrupted) ELF header, `@enumFromInt` can panic casting the exhaustive enum `ET`.
This commit is contained in:
parent
5c39ccddda
commit
33f0d458cf
1 changed files with 6 additions and 0 deletions
|
|
@ -462,6 +462,8 @@ pub const ET = enum(u16) {
|
|||
/// Core file
|
||||
CORE = 4,
|
||||
|
||||
_,
|
||||
|
||||
/// Beginning of OS-specific codes
|
||||
pub const LOOS = 0xfe00;
|
||||
|
||||
|
|
@ -532,17 +534,21 @@ pub const Header = struct {
|
|||
};
|
||||
const need_bswap = endian != native_endian;
|
||||
|
||||
// Converting integers to exhaustive enums using `@enumFromInt` could cause a panic.
|
||||
comptime assert(!@typeInfo(OSABI).@"enum".is_exhaustive);
|
||||
const os_abi: OSABI = @enumFromInt(hdr32.e_ident[EI_OSABI]);
|
||||
|
||||
// The meaning of this value depends on `os_abi` so just make it available as `u8`.
|
||||
const abi_version = hdr32.e_ident[EI_ABIVERSION];
|
||||
|
||||
const @"type" = if (need_bswap) blk: {
|
||||
comptime assert(!@typeInfo(ET).@"enum".is_exhaustive);
|
||||
const value = @intFromEnum(hdr32.e_type);
|
||||
break :blk @as(ET, @enumFromInt(@byteSwap(value)));
|
||||
} else hdr32.e_type;
|
||||
|
||||
const machine = if (need_bswap) blk: {
|
||||
comptime assert(!@typeInfo(EM).@"enum".is_exhaustive);
|
||||
const value = @intFromEnum(hdr32.e_machine);
|
||||
break :blk @as(EM, @enumFromInt(@byteSwap(value)));
|
||||
} else hdr32.e_machine;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue