Allow unaligned load/store in QVM interpreter/x86 compiler
constructions like (dataMask & ~3) was used to protect against out-of-bound load/store when address is 4-byte closer to dataMask but at the same time it effectively cut low address bits for ALL load/store operations which is totally wrong in terms of conformance to ALLOWED (i.e. generated by q3lcc from C sources) low-level operations like packed binary data parsing
This commit is contained in:
parent
abce15055c
commit
566fb0edfc
4 changed files with 17 additions and 14 deletions
|
@ -451,13 +451,15 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc, qboolean unpure)
|
|||
if(alloc)
|
||||
{
|
||||
// allocate zero filled space for initialized and uninitialized data
|
||||
vm->dataBase = Hunk_Alloc(dataLength, h_high);
|
||||
// leave some space beyound data mask so we can secure all mask operations
|
||||
vm->dataAlloc = dataLength + 4;
|
||||
vm->dataBase = Hunk_Alloc(vm->dataAlloc, h_high);
|
||||
vm->dataMask = dataLength - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// clear the data, but make sure we're not clearing more than allocated
|
||||
if(vm->dataMask + 1 != dataLength)
|
||||
if(vm->dataAlloc != dataLength + 4)
|
||||
{
|
||||
VM_Free(vm);
|
||||
FS_FreeFile(header.v);
|
||||
|
@ -467,7 +469,7 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc, qboolean unpure)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
Com_Memset(vm->dataBase, 0, dataLength);
|
||||
Com_Memset(vm->dataBase, 0, vm->dataAlloc);
|
||||
}
|
||||
|
||||
// copy the intialized data
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue