From 9ab9cbfa05c24abe2d89920ad5cec62de9c0bf1b Mon Sep 17 00:00:00 2001 From: Cody Tapscott Date: Tue, 12 Aug 2025 09:19:08 -0400 Subject: [PATCH] Fix magic number printing --- src/COFF/COFFHandle.jl | 4 ++-- src/ELF/ELFHandle.jl | 4 ++-- src/MachO/MachOHeader.jl | 6 +++--- test/runtests.jl | 27 +++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/COFF/COFFHandle.jl b/src/COFF/COFFHandle.jl index 3290753..f4ff1d8 100644 --- a/src/COFF/COFFHandle.jl +++ b/src/COFF/COFFHandle.jl @@ -49,8 +49,8 @@ function readmeta(io::IO, ::Type{H}) where {H <: COFFHandle} magic = [read(io, UInt8) for idx in 1:4] if any(magic .!= PE_magic) msg = """ - Magic Number 0x$(join(string.(magic, base=16),"")) does not match expected PE - magic number 0x$(join("", string.(PE_magic, base=16))) + Magic Number 0x$(join(string.(magic, base=16, pad=2),"")) does not match expected PE + magic number 0x$(join(string.(PE_magic, base=16, pad=2),"")) """ throw(MagicMismatch(replace(strip(msg), "\n" => " "))) end diff --git a/src/ELF/ELFHandle.jl b/src/ELF/ELFHandle.jl index 1b34e0c..cbb02f3 100644 --- a/src/ELF/ELFHandle.jl +++ b/src/ELF/ELFHandle.jl @@ -38,8 +38,8 @@ function readmeta(io::IO, ::Type{H}) where {H <: ELFHandle} magic = [read(io, UInt8) for idx in 1:4] if any(magic .!= elven_magic) msg = """ - Magic Number 0x$(join(string.(magic, base=16),"")) does not match expected ELF - magic number 0x$(join("", string.(elven_magic, base=16))) + Magic Number 0x$(join(string.(magic, base=16, pad=2),"")) does not match expected ELF + magic number 0x$(join(string.(elven_magic, base=16, pad=2),"")) """ throw(MagicMismatch(replace(strip(msg), "\n" => " "))) end diff --git a/src/MachO/MachOHeader.jl b/src/MachO/MachOHeader.jl index 12c46ad..de965e6 100644 --- a/src/MachO/MachOHeader.jl +++ b/src/MachO/MachOHeader.jl @@ -47,7 +47,7 @@ function macho_header_type(magic::UInt32) elseif magic in (METALLIB_MAGIC,) return MetallibHeader{MachOHandle} else - throw(MagicMismatch("Invalid Magic ($(string(magic, base=16)))!")) + throw(MagicMismatch("Invalid Magic (0x$(string(magic, base=16, pad=8)))!")) end end @@ -63,7 +63,7 @@ function macho_is64bit(magic::UInt32) elseif magic in (MH_MAGIC, MH_CIGAM, FAT_MAGIC, FAT_CIGAM, FAT_MAGIC_METAL, FAT_CIGAM_METAL, METALLIB_MAGIC) return false else - throw(MagicMismatch("Invalid Magic ($(string(magic, base=16)))!")) + throw(MagicMismatch("Invalid Magic (0x$(string(magic, base=16, pad=8)))!")) end end @@ -79,7 +79,7 @@ function macho_endianness(magic::UInt32) elseif magic in (MH_MAGIC, MH_MAGIC_64, FAT_MAGIC, FAT_MAGIC_METAL, METALLIB_MAGIC) return :LittleEndian else - throw(MagicMismatch("Invalid Magic ($(string(magic, base=16)))!")) + throw(MagicMismatch("Invalid Magic (0x$(string(magic, base=16, pad=8)))!")) end end diff --git a/test/runtests.jl b/test/runtests.jl index dbde158..2d32a93 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -12,6 +12,27 @@ using Test end end +function check_magic_mismatch(path, HandleType) + err = try + readmeta(open(path, "r"), HandleType) + catch err + err + end + + @test err isa MagicMismatch + if HandleType === ELFHandle + @test occursin(r"Magic Number 0x[a-f0-9]{8} does not match expected ELF magic number 0x7f454c46", repr(err)) + elseif HandleType === COFFHandle + @test occursin(r"Magic Number 0x[a-f0-9]{8} does not match expected PE magic number 0x50450000", repr(err)) + elseif HandleType === MachOHandle + @test occursin(r"Invalid Magic \(0x[a-f0-9]{8}\)\!", repr(err)) + else + @assert false "unexpected handle type" + end + + return nothing +end + function test_libfoo_and_fooifier(fooifier_path, libfoo_path) # Actually read it in oh_exe = only(readmeta(open(fooifier_path, "r"))) @@ -43,6 +64,12 @@ function test_libfoo_and_fooifier(fooifier_path, libfoo_path) # Test that we got the right type @test typeof(oh) <: H + # Test that the wrong types all error as expected + for MismatchedType in (ELFHandle, COFFHandle, MachOHandle) + H === MismatchedType && continue + check_magic_mismatch(fooifier_path, MismatchedType) + end + # Test that we got the right number of bits @test is64bit(oh) == (bits == "64") @test platforms_match(Platform(oh), platforms[dir_path])