Fix: off-by-one in sequence filter comparator
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 8 Nov 2014 17:16:41 +0000 (12:16 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 8 Nov 2014 17:29:03 +0000 (12:29 -0500)
If we pass the following sequence as event input:
- field name "seqfield2"
- seq. len.: 4
- sequence array: "testA" (5 characters),

The following filters do not have the intended effect:
* 'seqfield2=="testA"'
  - expected: no match.
  - actual behavior: match.

* 'seqfield2=="test"'
  - expected: match.
  - actual behavior: no match.

This is caused by an off-by-one in the comparison with sequence length
in the filter bytecode interpreter.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust/lttng-filter-interpreter.c

index 29bcaeffa0656cacea08f59f5c6b782bb23c1af7..df4add225dbb2585548b6bcb740a4aaa026772b8 100644 (file)
@@ -58,8 +58,8 @@ int stack_strcmp(struct estack *stack, int top, const char *cmp_type)
        for (;;) {
                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 (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') {
                                return 0;
                        } else {
                                if (estack_ax(stack, top)->u.s.literal) {
@@ -70,8 +70,8 @@ int stack_strcmp(struct estack *stack, int top, const char *cmp_type)
                                return -1;
                        }
                }
-               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 (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') {
                                return 0;
                        } else {
                                if (estack_bx(stack, top)->u.s.literal) {
This page took 0.025707 seconds and 4 git commands to generate.