Commit 33f0d458cf

Rafael Batiati <rbatiati@gmail.com>
2025-02-11 22:12:44
std.elf: fix panic while parsing header
When parsing an invalid (e.g., corrupted) ELF header, `@enumFromInt` can panic casting the exhaustive enum `ET`.
1 parent 5c39ccd
Changed files (1)
lib
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;