From 42fe803a39a8a048e236e35e3d88ceb50183d7cc Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Thu, 21 Dec 2000 10:04:27 +0000 Subject: [PATCH] Cleaned up some canPack() checks. committer: mfx 977393067 +0000 --- src/p_vmlinz.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/p_vmlinz.cpp b/src/p_vmlinz.cpp index 9ac2e96a..4a8f0ae7 100644 --- a/src/p_vmlinz.cpp +++ b/src/p_vmlinz.cpp @@ -95,16 +95,22 @@ int PackVmlinuzI386::readFileHeader() setup_size = (1 + (h.setup_sects ? h.setup_sects : 4)) * 0x200; if (setup_size <= 0 || setup_size >= file_size) return -1; - if (setup_size + 16 * h.sys_size // beware 16-bit sys_size - != (~(~0u<<20) & (unsigned) ALIGN_UP(file_size, 16)) ) + + int format = UPX_F_VMLINUZ_i386; + unsigned sys_size = ALIGN_UP(file_size, 16) - setup_size; + if (memcmp(h.hdrs, "HdrS", 4) == 0 && (h.load_flags & 1) != 0) + { + format = UPX_F_BVMLINUZ_i386; + // account for 16-bit h.sys_size, wraparound at 20 bits + sys_size &= (1 << 20) - 1; + } + + if (16 * h.sys_size != sys_size) return -1; // FIXME: add more checks for a valid kernel - if (memcmp(h.hdrs, "HdrS", 4) == 0 && (h.load_flags & 1) != 0) - return UPX_F_BVMLINUZ_i386; - - return UPX_F_VMLINUZ_i386; + return format; }