From: Jérémie Galarneau Date: Thu, 30 Mar 2023 18:56:15 +0000 (-0400) Subject: Fix: segmentation fault on filter interpretation in "switch" mode X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=7d54bba42d167e5d74dfdff858153742b199b4f6;p=lttng-ust.git Fix: segmentation fault on filter interpretation in "switch" mode When building the interpreter with `INTERPRETER_USE_SWITCH`, I get the following crash when interpreting a bytecode: Program terminated with signal SIGSEGV, Segmentation fault. (gdb) bt #0 0x00007f5789aee443 in lttng_bytecode_interpret (ust_bytecode=0x555dfe90a650, interpreter_stack_data=0x7ffd12615500 "", probe_ctx=0x7ffd12615620, caller_ctx=0x7ffd126154bc) at lttng-bytecode-interpreter.c:885 #1 0x00007f5789af4da2 in lttng_ust_interpret_event_filter (event=0x555dfe90a580, interpreter_stack_data=0x7ffd12615500 "", probe_ctx=0x7ffd12615620, event_filter_ctx=0x0) at lttng-bytecode-interpreter.c:2548 #2 0x0000555dfe02d2d4 in lttng_ust__event_probe__tp___the_string (__tp_data=0x555dfe90a580, i=0, arg_i=2, str=0x7ffd12617cfa "hypothec") at ././tp.h:16 #3 0x0000555dfe02cac0 in lttng_ust_tracepoint_cb_tp___the_string (str=0x7ffd12617cfa "hypothec", arg_i=2, i=0) at /tmp/lttng-master/src/lttng-tools/tests/utils/testapp/gen-ust-nevents-str/tp.h:16 #4 main (argc=39, argv=0x7ffd12615818) at gen-ust-nevents-str.cpp:38 This appears to be caused by `bytecode->data` being used to determine the `start_pc` address. In my case, `data` is NULL. A quick look around the code seems to show that this member is not used except during the transmission of the bytecode. I am basing the fix on the implementation of START_OP in the default case which uses `code` in lieu of `data` and can confirm that it fixes the crash on my end. Signed-off-by: Jérémie Galarneau Signed-off-by: Mathieu Desnoyers Change-Id: I0773df385b8e90728b60503016dec4b46d902234 --- diff --git a/src/lib/lttng-ust/lttng-bytecode-interpreter.c b/src/lib/lttng-ust/lttng-bytecode-interpreter.c index 7f19e981..89ad1f92 100644 --- a/src/lib/lttng-ust/lttng-bytecode-interpreter.c +++ b/src/lib/lttng-ust/lttng-bytecode-interpreter.c @@ -166,7 +166,7 @@ int lttng_bytecode_interpret_error( */ #define START_OP \ - start_pc = &bytecode->data[0]; \ + start_pc = &bytecode->code[0]; \ for (pc = next_pc = start_pc; pc - start_pc < bytecode->len; \ pc = next_pc) { \ dbg_printf("Executing op %s (%u)\n", \