]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Fixed segfault when a case option had an empty block
authorMaria Matejka <mq@ucw.cz>
Thu, 22 Jun 2023 14:07:28 +0000 (16:07 +0200)
committerMaria Matejka <mq@ucw.cz>
Thu, 22 Jun 2023 14:12:17 +0000 (16:12 +0200)
Thanks to Kobayashi_Bairuo <noc@tohunet.com> for reporting.

filter/decl.m4
filter/f-inst.c
filter/test.conf

index 5b35b672ad52dc22d4be973b4bf51c1f37ed39b6..7c863bdc4db38978cdb42d4f7493e95c1e160805 100644 (file)
@@ -200,7 +200,7 @@ FID_INTERPRET_BODY()')
 #      Executing another filter line. This replaces the recursion
 #      that was needed in the former implementation.
 m4_define(LINEX, `FID_INTERPRET_EXEC()LINEX_($1)FID_INTERPRET_NEW()return $1 FID_INTERPRET_BODY()')
-m4_define(LINEX_, `do {
+m4_define(LINEX_, `do if ($1) {
   fstk->estk[fstk->ecnt].pos = 0;
   fstk->estk[fstk->ecnt].line = $1;
   fstk->estk[fstk->ecnt].ventry = fstk->vcnt;
@@ -227,9 +227,7 @@ if (!f_same(f1->fl$1, f2->fl$1)) return 0;
 FID_ITERATE_BODY()m4_dnl
 if (whati->fl$1) BUFFER_PUSH(fit->lines) = whati->fl$1;
 FID_INTERPRET_EXEC()m4_dnl
-do { if (whati->fl$1) {
-  LINEX_(whati->fl$1);
-} } while(0)
+LINEX_(whati->fl$1)
 FID_INTERPRET_NEW()m4_dnl
 return whati->f$1
 FID_INTERPRET_BODY()')
index e4b47ff48499fed83a4a103b82ebe8d4a66812f8..33436853eaa811557d3fabf690ff5e2c0fc2a3f0 100644 (file)
        FID_HIC(,break,return NULL);
       }
     }
-    /* It is actually possible to have t->data NULL */
 
     LINEX(t->data);
   }
index 600c551e41754507c6dcae72fa60f02d1e708c0d..e9e3af899375771a88e9f045ec299b435128d331 100644 (file)
@@ -38,6 +38,18 @@ bt_test_same(onef, onef, 1);
 bt_test_same(onef, oneg, 1);
 bt_test_same(onef, twof, 0);
 
+/*
+ *     Testing filter corner cases
+ *     ---------------------------
+ */
+
+function t_nothing() {}
+bt_test_suite(t_nothing, "Testing nothing");
+
+function t_metanothing() { t_nothing(); }
+bt_test_suite(t_metanothing, "Testing meta nothing");
+
+
 /*
  *     Testing boolean expressions
  *     ---------------------------
@@ -76,6 +88,14 @@ bt_test_suite(t_bool, "Testing boolean expressions");
  *     ----------------
  */
 
+function aux_t_int(int t; int u)
+{
+       case t {
+               1: {}
+               else: {}
+       }
+}
+
 define four = 4;
 define xyzzy = (120+10);
 define '1a-a1' = (xyzzy-100);
@@ -120,7 +140,10 @@ function t_int()
                else: bt_assert(false);
        }
 
-
+       aux_t_int(1, 2);
+       aux_t_int(1, 3);
+       aux_t_int(2, 3);
+       aux_t_int(2, 2);
 }
 
 bt_test_suite(t_int, "Testing integers");