VM: always clear the data and retainstack in general_error because they might contain uninitialized values (#1187)
							parent
							
								
									348bd85824
								
							
						
					
					
						commit
						378f208025
					
				| 
						 | 
				
			
			@ -39,16 +39,6 @@ void context::reset() {
 | 
			
		|||
  reset_context_objects();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void context::fix_stacks() {
 | 
			
		||||
  if (datastack + sizeof(cell) < datastack_seg->start ||
 | 
			
		||||
      datastack + stack_reserved >= datastack_seg->end)
 | 
			
		||||
    reset_datastack();
 | 
			
		||||
 | 
			
		||||
  if (retainstack + sizeof(cell) < retainstack_seg->start ||
 | 
			
		||||
      retainstack + stack_reserved >= retainstack_seg->end)
 | 
			
		||||
    reset_retainstack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
context::~context() {
 | 
			
		||||
  delete datastack_seg;
 | 
			
		||||
  delete retainstack_seg;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,6 @@ struct context {
 | 
			
		|||
  void reset_callstack();
 | 
			
		||||
  void reset_context_objects();
 | 
			
		||||
  void reset();
 | 
			
		||||
  void fix_stacks();
 | 
			
		||||
  void scrub_stacks(gc_info* info, cell index);
 | 
			
		||||
 | 
			
		||||
  cell peek() { return *(cell*)datastack; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,17 +44,19 @@ void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) {
 | 
			
		|||
 | 
			
		||||
  faulting_p = true;
 | 
			
		||||
 | 
			
		||||
  /* If we had an underflow or overflow, data or retain stack
 | 
			
		||||
     pointers might be out of bounds, so fix them before allocating
 | 
			
		||||
     anything */
 | 
			
		||||
  ctx->fix_stacks();
 | 
			
		||||
  /* If we had an underflow or overflow, data or retain stack pointers
 | 
			
		||||
     might be out of bounds, or some of their slots might be
 | 
			
		||||
     uninitialized, so reset them before allocating anything. */
 | 
			
		||||
  ctx->reset_datastack();
 | 
			
		||||
  ctx->reset_retainstack();
 | 
			
		||||
 | 
			
		||||
  /* If error was thrown during heap scan, we re-enable the GC */
 | 
			
		||||
  gc_off = false;
 | 
			
		||||
 | 
			
		||||
  cell error_handler = special_objects[ERROR_HANDLER_QUOT];
 | 
			
		||||
  /* If the error handler is set, we rewind any C stack frames and
 | 
			
		||||
     pass the error to user-space. */
 | 
			
		||||
  if (!current_gc && to_boolean(special_objects[ERROR_HANDLER_QUOT])) {
 | 
			
		||||
  if (!current_gc && to_boolean(error_handler)) {
 | 
			
		||||
#ifdef FACTOR_DEBUG
 | 
			
		||||
    /* Doing a GC here triggers all kinds of funny errors */
 | 
			
		||||
    primitive_compact_gc();
 | 
			
		||||
| 
						 | 
				
			
			@ -72,8 +74,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) {
 | 
			
		|||
 | 
			
		||||
    /* The unwind-native-frames subprimitive will clear faulting_p
 | 
			
		||||
       if it was successfully reached. */
 | 
			
		||||
    unwind_native_frames(special_objects[ERROR_HANDLER_QUOT],
 | 
			
		||||
                         ctx->callstack_top);
 | 
			
		||||
    unwind_native_frames(error_handler, ctx->callstack_top);
 | 
			
		||||
  } /* Error was thrown in early startup before error handler is set, so just
 | 
			
		||||
       crash. */
 | 
			
		||||
  else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue