vlib: fix segfault on panic in worker 96/38596/1
authorMikhail Sokolovskiy <sokolmish@gmail.com>
Thu, 30 Mar 2023 10:27:33 +0000 (13:27 +0300)
committerMikhail Sokolovskiy <sokolmish@gmail.com>
Thu, 30 Mar 2023 10:27:33 +0000 (13:27 +0300)
Vlib panic uses longjmp to exit main loop, but workers don't set main_loop_exit
field on initialization, so this jump corrupts registers and causes segfault.

There I add clib_warning and abort if longjmp context hasn't been set.

Type: fix
Signed-off-by: Mikhail Sokolovskiy <sokolmish@gmail.com>
Change-Id: I0d705f1f139c4083af75066aeb525964ed0aa202

src/vlib/main.h

index a9cfab4..94b8c4f 100644 (file)
@@ -377,7 +377,13 @@ always_inline void
 vlib_panic_with_error (vlib_main_t * vm, clib_error_t * error)
 {
   vm->main_loop_error = error;
-  clib_longjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_PANIC);
+  if (vm->main_loop_exit_set)
+    clib_longjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_PANIC);
+  else
+    {
+      clib_warning ("panic: %U", format_clib_error, error);
+      abort ();
+    }
 }
 
 #define vlib_panic_with_msg(vm,args...) \