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-Tag: v2.12.8~1 X-Git-Url: http://git.lttng.org/?p=lttng-ust.git;a=commitdiff_plain;h=56ae3133ab3aa7899c1b102205faa6cdf5101f0e 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/liblttng-ust/lttng-filter-interpreter.c b/liblttng-ust/lttng-filter-interpreter.c index d558b6b2..f991ebb7 100644 --- a/liblttng-ust/lttng-filter-interpreter.c +++ b/liblttng-ust/lttng-filter-interpreter.c @@ -173,7 +173,7 @@ uint64_t lttng_filter_false(void *filter_data, */ #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", \