/* * Copyright (c) 2019 The Regents of the University of California * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Bobby R. Bruce */ #include #include "base/loader/exec_aout.h" #define OMAGIC_STRUCT (*((const aout_exechdr *)omagic)) #define NMAGIC_STRUCT (*((const aout_exechdr *)nmagic)) #define ZMAGIC_STRUCT (*((const aout_exechdr *)zmagic)) #define NO_MAGIC_STRUCT (*((const aout_exechdr *)no_magic)) #if (defined(_BIG_ENDIAN) || !defined(_LITTLE_ENDIAN))\ && BYTE_ORDER==BIG_ENDIAN const uint8_t omagic[] { 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t nmagic[] { 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t zmagic[] { 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t no_magic[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 }; #elif defined(_LITTLE_ENDIAN) || BYTE_ORDER==LITTLE_ENDIAN const uint8_t omagic[] { 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t nmagic[] { 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t zmagic[] { 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t no_magic[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; #else #error Invalid Endianess #endif TEST(ExecAoutTest, IsNotBadMagicNumber) { EXPECT_FALSE(N_BADMAG(OMAGIC_STRUCT)); EXPECT_FALSE(N_BADMAG(NMAGIC_STRUCT)); EXPECT_FALSE(N_BADMAG(ZMAGIC_STRUCT)); } TEST(ExecAoutTest, IsBadMagicNumber) { EXPECT_TRUE(N_BADMAG(NO_MAGIC_STRUCT)); } TEST(ExecAoutTest, AlignNotZmagic) { /* * N_ALIGN will return x if the aout_exechdr does not have ZMAGIC as a * magic number. */ int64_t x = 0xABCD; EXPECT_EQ(x, N_ALIGN(OMAGIC_STRUCT, x)); EXPECT_EQ(x, N_ALIGN(NMAGIC_STRUCT, x)); EXPECT_EQ(x, N_ALIGN(NO_MAGIC_STRUCT, x)); } TEST(ExecAoutTest, AlignIsZmagic) { /* * N_ALIGN will round up X by AOUT_LDPGSZ (1 << 13) if the aout_exechdr * has ZMAGIC as a magic number. */ int64_t x = (1 << 20) + (1 << 18) + (1 << 12) + (1 << 5) + 1; EXPECT_EQ((1 << 20) + (1 << 18) + (1 << 13), N_ALIGN(ZMAGIC_STRUCT, x)); } TEST(ExecAoutTest, AlignIsZmagicNoRounding) { /* * In this case, there's no rounding needed. */ int64_t x = (1 << 20) + (1 << 18) + (1 << 13); EXPECT_EQ(x, N_ALIGN(ZMAGIC_STRUCT, x)); }