Fix: filter string wildcard comparison
[lttng-ust.git] / liblttng-ust / lttng-filter-interpreter.c
index e6e96dbff9a9bf53cdb346b68cd63a9b4728d457..8d74e7f9615461f1421f1042ee49234c64f33175 100644 (file)
@@ -59,17 +59,27 @@ int stack_strcmp(struct estack *stack, int top, const char *cmp_type)
                int escaped_r0 = 0;
 
                if (unlikely(p - estack_bx(stack, top)->u.s.str > estack_bx(stack, top)->u.s.seq_len || *p == '\0')) {
-                       if (q - estack_ax(stack, top)->u.s.str > estack_ax(stack, top)->u.s.seq_len || *q == '\0')
+                       if (q - estack_ax(stack, top)->u.s.str > estack_ax(stack, top)->u.s.seq_len || *q == '\0') {
                                diff = 0;
-                       else
-                               diff = -1;
+                       } else {
+                               ret = parse_char(&q);
+                               if (ret == -1)
+                                       diff = 0;
+                               else
+                                       diff = -1;
+                       }
                        break;
                }
                if (unlikely(q - estack_ax(stack, top)->u.s.str > estack_ax(stack, top)->u.s.seq_len || *q == '\0')) {
-                       if (p - estack_bx(stack, top)->u.s.str > estack_bx(stack, top)->u.s.seq_len || *p == '\0')
+                       if (p - estack_bx(stack, top)->u.s.str > estack_bx(stack, top)->u.s.seq_len || *p == '\0') {
                                diff = 0;
-                       else
-                               diff = 1;
+                       } else {
+                               ret = parse_char(&p);
+                               if (ret == -1)
+                                       diff = 0;
+                               else
+                                       diff = 1;
+                       }
                        break;
                }
                if (estack_bx(stack, top)->u.s.literal) {
@@ -105,7 +115,7 @@ int stack_strcmp(struct estack *stack, int top, const char *cmp_type)
        return diff;
 }
 
-int lttng_filter_false(void *filter_data,
+uint64_t lttng_filter_false(void *filter_data,
                const char *filter_stack_data)
 {
        return 0;
@@ -157,13 +167,18 @@ LABEL_##name
 
 #endif
 
-int lttng_filter_interpret_bytecode(void *filter_data,
+/*
+ * Return 0 (discard), or raise the 0x1 flag (log event).
+ * Currently, other flags are kept for future extensions and have no
+ * effect.
+ */
+uint64_t lttng_filter_interpret_bytecode(void *filter_data,
                const char *filter_stack_data)
 {
        struct bytecode_runtime *bytecode = filter_data;
        void *pc, *next_pc, *start_pc;
        int ret = -EINVAL;
-       int retval = 0;
+       uint64_t retval = 0;
        struct estack _stack;
        struct estack *stack = &_stack;
        register int64_t ax = 0, bx = 0;
@@ -279,6 +294,7 @@ int lttng_filter_interpret_bytecode(void *filter_data,
                        goto end;
 
                OP(FILTER_OP_RETURN):
+                       /* LTTNG_FILTER_DISCARD  or LTTNG_FILTER_RECORD_FLAG */
                        retval = !!estack_ax_v;
                        ret = 0;
                        goto end;
This page took 0.025195 seconds and 4 git commands to generate.