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:
Rafael Batiati 2025-02-11 18:12:44 -03:00 committed by GitHub
parent 5c39ccddda
commit 33f0d458cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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;