From 33f0d458cf1ff8450297274f2e69afd64abbe816 Mon Sep 17 00:00:00 2001 From: Rafael Batiati Date: Tue, 11 Feb 2025 18:12:44 -0300 Subject: [PATCH] std.elf: fix panic while parsing header When parsing an invalid (e.g., corrupted) ELF header, `@enumFromInt` can panic casting the exhaustive enum `ET`. --- lib/std/elf.zig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/std/elf.zig b/lib/std/elf.zig index f61114b53d..5ffcc629cc 100644 --- a/lib/std/elf.zig +++ b/lib/std/elf.zig @@ -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;