//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005-2014 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// DESCRIPTION:
// Padding of Reject Lump
//
#include <stdio.h>
#include <string.h>
#include "m_argv.h"
#include "p_rejectpad.h"
// Pad the REJECT lump with extra data when the lump is too small,
// to simulate a REJECT buffer overflow in Vanilla Doom.
void PadRejectArray(byte *array, unsigned int len, int totallines)
{
unsigned int i;
unsigned int byte_num;
byte *dest;
unsigned int padvalue;
// Values to pad the REJECT array with:
unsigned int rejectpad[4] =
{
0, // Size
0, // Part of z_zone block header
50, // PU_LEVEL
0x1d4a11 // DOOM_CONST_ZONEID
};
rejectpad[0] = ((totallines * 4 + 3) & ~3) + 24;
// Copy values from rejectpad into the destination array.
dest = array;
for (i=0; i<len && i<sizeof(rejectpad); ++i)
{
byte_num = i % 4;
*dest = (rejectpad[i / 4] >> (byte_num * 8)) & 0xff;
++dest;
}
// We only have a limited pad size. Print a warning if the
// REJECT lump is too small.
if (len > sizeof(rejectpad))
{
fprintf(stderr, "PadRejectArray: REJECT lump too short to pad! (%u > %i)\n",
len, (int) sizeof(rejectpad));
// Pad remaining space with 0 (or 0xff, if specified on command line).
if (M_CheckParm("-reject_pad_with_ff"))
{
padvalue = 0xff;
}
else
{
padvalue = 0x00;
}
memset(array + sizeof(rejectpad), padvalue, len - sizeof(rejectpad));
}
}