Add some checks when reloading QVMs via VM_Restart()

This commit is contained in:
Thilo Schulz 2011-09-27 21:49:01 +00:00
parent acc2da023c
commit d176ebe84a

View file

@ -447,12 +447,25 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
} }
dataLength = 1 << i; dataLength = 1 << i;
if( alloc ) { if(alloc)
{
// allocate zero filled space for initialized and uninitialized data // allocate zero filled space for initialized and uninitialized data
vm->dataBase = Hunk_Alloc(dataLength, h_high); vm->dataBase = Hunk_Alloc(dataLength, h_high);
vm->dataMask = dataLength - 1; vm->dataMask = dataLength - 1;
} else { }
// clear the data else
{
// clear the data, but make sure we're not clearing more than allocated
if(vm->dataMask + 1 != dataLength)
{
VM_Free(vm);
FS_FreeFile(header.v);
Com_Printf(S_COLOR_YELLOW "Warning: Data region size of %s not matching after"
"VM_Restart()\n", filename);
return NULL;
}
Com_Memset(vm->dataBase, 0, dataLength); Com_Memset(vm->dataBase, 0, dataLength);
} }
@ -465,13 +478,29 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
*(int *)(vm->dataBase + i) = LittleLong( *(int *)(vm->dataBase + i ) ); *(int *)(vm->dataBase + i) = LittleLong( *(int *)(vm->dataBase + i ) );
} }
if( header.h->vmMagic == VM_MAGIC_VER2 ) { if(header.h->vmMagic == VM_MAGIC_VER2)
vm->numJumpTableTargets = header.h->jtrgLength >> 2; {
Com_Printf("Loading %d jump table targets\n", vm->numJumpTableTargets); Com_Printf("Loading %d jump table targets\n", vm->numJumpTableTargets);
if( alloc ) { header.h->jtrgLength &= ~0x03;
if(alloc)
{
vm->jumpTableTargets = Hunk_Alloc(header.h->jtrgLength, h_high); vm->jumpTableTargets = Hunk_Alloc(header.h->jtrgLength, h_high);
} else { vm->numJumpTableTargets = header.h->jtrgLength >> 2;
}
else
{
if((header.h->jtrgLength >> 2) != vm->numJumpTableTargets)
{
VM_Free(vm);
FS_FreeFile(header.v);
Com_Printf(S_COLOR_YELLOW "Warning: Jump table size of %s not matching after"
"VM_Restart()\n", filename);
return NULL;
}
Com_Memset(vm->jumpTableTargets, 0, header.h->jtrgLength); Com_Memset(vm->jumpTableTargets, 0, header.h->jtrgLength);
} }