mirror of
				https://codeberg.org/1414codeforge/ubgpsuite.git
				synced 2025-06-05 21:29:11 +02:00 
			
		
		
		
	[bgp/vm] Drop vm->isRunning and other metadata, Bgp_VmExec() could leave the VM in an inconsistent state on longjmp(), causing troubles
This commit is contained in:
		| @@ -69,8 +69,6 @@ Judgement Bgp_InitVm(Bgpvm *vm, size_t heapSiz) | |||||||
|  |  | ||||||
| Judgement Bgp_VmEmit(Bgpvm *vm, Bgpvmbytec bytec) | Judgement Bgp_VmEmit(Bgpvm *vm, Bgpvmbytec bytec) | ||||||
| { | { | ||||||
| 	assert(!vm->isRunning); |  | ||||||
|  |  | ||||||
| 	BGP_VMCLRERR(vm); | 	BGP_VMCLRERR(vm); | ||||||
|  |  | ||||||
| 	if (BGP_VMOPC(bytec) == BGP_VMOP_END) | 	if (BGP_VMOPC(bytec) == BGP_VMOP_END) | ||||||
| @@ -100,8 +98,6 @@ Judgement Bgp_VmEmit(Bgpvm *vm, Bgpvmbytec bytec) | |||||||
|  |  | ||||||
| void *Bgp_VmPermAlloc(Bgpvm *vm, size_t size) | void *Bgp_VmPermAlloc(Bgpvm *vm, size_t size) | ||||||
| { | { | ||||||
| 	assert(!vm->isRunning); |  | ||||||
|  |  | ||||||
| 	BGP_VMCLRERR(vm); | 	BGP_VMCLRERR(vm); | ||||||
|  |  | ||||||
| 	size = ALIGN(size, ALIGNMENT); | 	size = ALIGN(size, ALIGNMENT); | ||||||
| @@ -124,8 +120,6 @@ void *Bgp_VmPermAlloc(Bgpvm *vm, size_t size) | |||||||
|  |  | ||||||
| void *Bgp_VmTempAlloc(Bgpvm *vm, size_t size) | void *Bgp_VmTempAlloc(Bgpvm *vm, size_t size) | ||||||
| { | { | ||||||
| 	assert(vm->isRunning); |  | ||||||
|  |  | ||||||
| 	size = ALIGN(size, ALIGNMENT); | 	size = ALIGN(size, ALIGNMENT); | ||||||
|  |  | ||||||
| 	size_t stksiz = vm->si * sizeof(Bgpvmval); | 	size_t stksiz = vm->si * sizeof(Bgpvmval); | ||||||
| @@ -144,8 +138,6 @@ void *Bgp_VmTempAlloc(Bgpvm *vm, size_t size) | |||||||
|  |  | ||||||
| void Bgp_VmTempFree(Bgpvm *vm, size_t size) | void Bgp_VmTempFree(Bgpvm *vm, size_t size) | ||||||
| { | { | ||||||
| 	assert(vm->isRunning); |  | ||||||
|  |  | ||||||
| 	size = ALIGN(size, ALIGNMENT); | 	size = ALIGN(size, ALIGNMENT); | ||||||
|  |  | ||||||
| 	assert(size + vm->hHighMark <= vm->hMemSiz); | 	assert(size + vm->hHighMark <= vm->hMemSiz); | ||||||
| @@ -155,8 +147,6 @@ void Bgp_VmTempFree(Bgpvm *vm, size_t size) | |||||||
| Boolean Bgp_VmExec(Bgpvm *vm, Bgpmsg *msg) | Boolean Bgp_VmExec(Bgpvm *vm, Bgpmsg *msg) | ||||||
| { | { | ||||||
| 	// Fundamental sanity checks | 	// Fundamental sanity checks | ||||||
| 	assert(!vm->isRunning); |  | ||||||
|  |  | ||||||
| 	if (vm->setupFailed) UNLIKELY { | 	if (vm->setupFailed) UNLIKELY { | ||||||
| 		vm->errCode = BGPEBADVM; | 		vm->errCode = BGPEBADVM; | ||||||
| 		goto cant_run; | 		goto cant_run; | ||||||
| @@ -177,7 +167,7 @@ Boolean Bgp_VmExec(Bgpvm *vm, Bgpmsg *msg) | |||||||
| 	vm->msg       = msg; | 	vm->msg       = msg; | ||||||
| 	vm->curMatch  = &discardMatch; | 	vm->curMatch  = &discardMatch; | ||||||
| 	vm->matches   = NULL; | 	vm->matches   = NULL; | ||||||
| 	vm->errCode   = BGPENOERR; | 	BGP_VMCLRERR(vm); | ||||||
|  |  | ||||||
| 	// Populate computed goto table if necessary | 	// Populate computed goto table if necessary | ||||||
| #ifdef DF_BGP_VM_USES_COMPUTED_GOTO | #ifdef DF_BGP_VM_USES_COMPUTED_GOTO | ||||||
| @@ -187,7 +177,6 @@ Boolean Bgp_VmExec(Bgpvm *vm, Bgpmsg *msg) | |||||||
| 	// Execute bytecode according to the #included vm_<impl>def.h | 	// Execute bytecode according to the #included vm_<impl>def.h | ||||||
| 	Bgpvmbytec ir;  // Instruction Register | 	Bgpvmbytec ir;  // Instruction Register | ||||||
|  |  | ||||||
| 	vm->isRunning = TRUE; |  | ||||||
| 	while (TRUE) { | 	while (TRUE) { | ||||||
| 		// FETCH stage | 		// FETCH stage | ||||||
| 		FETCH(ir, vm); | 		FETCH(ir, vm); | ||||||
| @@ -316,9 +305,6 @@ Boolean Bgp_VmExec(Bgpvm *vm, Bgpmsg *msg) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| terminate: | terminate: | ||||||
| 	vm->curMatch  = NULL;  // prevent accidental access outside Bgp_VmExec() |  | ||||||
| 	vm->isRunning = FALSE; |  | ||||||
|  |  | ||||||
| 	if (Bgp_SetErrStat(vm->errCode) != OK) UNLIKELY | 	if (Bgp_SetErrStat(vm->errCode) != OK) UNLIKELY | ||||||
| 		result = FALSE; | 		result = FALSE; | ||||||
|  |  | ||||||
| @@ -352,8 +338,6 @@ Judgement Bgp_VmStoreMsgTypeMatch(Bgpvm *vm, Boolean isMatching) | |||||||
|  |  | ||||||
| void Bgp_VmStoreMatch(Bgpvm *vm) | void Bgp_VmStoreMatch(Bgpvm *vm) | ||||||
| { | { | ||||||
| 	assert(vm->isRunning); |  | ||||||
|  |  | ||||||
| 	if (vm->curMatch == &discardMatch) | 	if (vm->curMatch == &discardMatch) | ||||||
| 		return;  // discard store request | 		return;  // discard store request | ||||||
|  |  | ||||||
| @@ -811,8 +795,6 @@ void Bgp_VmDoRelt(Bgpvm *vm, Uint8 arg) | |||||||
|  |  | ||||||
| void Bgp_ResetVm(Bgpvm *vm) | void Bgp_ResetVm(Bgpvm *vm) | ||||||
| { | { | ||||||
| 	assert(!vm->isRunning); |  | ||||||
|  |  | ||||||
| 	vm->nk        = 0; | 	vm->nk        = 0; | ||||||
| 	vm->nfuncs    = 0; | 	vm->nfuncs    = 0; | ||||||
| 	vm->nmatches  = 0; | 	vm->nmatches  = 0; | ||||||
| @@ -831,8 +813,6 @@ void Bgp_ResetVm(Bgpvm *vm) | |||||||
|  |  | ||||||
| void Bgp_ClearVm(Bgpvm *vm) | void Bgp_ClearVm(Bgpvm *vm) | ||||||
| { | { | ||||||
| 	assert(!vm->isRunning); |  | ||||||
|  |  | ||||||
| 	free(vm->heap); | 	free(vm->heap); | ||||||
| 	free(vm->prog); | 	free(vm->prog); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -241,7 +241,6 @@ struct Bgpvm { | |||||||
| 	Uint16      nk;           ///< count of constants (K) available in `k` | 	Uint16      nk;           ///< count of constants (K) available in `k` | ||||||
| 	Uint8       nfuncs;       ///< count of functions (FN) available in `funcs` | 	Uint8       nfuncs;       ///< count of functions (FN) available in `funcs` | ||||||
| 	Boolean8    setupFailed;  ///< whether a `Bgp_VmEmit()` or `Bgp_VmPermAlloc()` on this VM ever failed. | 	Boolean8    setupFailed;  ///< whether a `Bgp_VmEmit()` or `Bgp_VmPermAlloc()` on this VM ever failed. | ||||||
| 	Boolean8    isRunning;    ///< whether the VM is being executed |  | ||||||
| 	BgpvmRet    errCode;      ///< whether the VM encountered an error | 	BgpvmRet    errCode;      ///< whether the VM encountered an error | ||||||
| 	Uint32      hLowMark;     ///< VM heap low memory mark | 	Uint32      hLowMark;     ///< VM heap low memory mark | ||||||
| 	Uint32      hHighMark;    ///< VM heap high memory mark | 	Uint32      hHighMark;    ///< VM heap high memory mark | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user