0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-09-18 19:35:20 +00:00

Filter: Fixed segfault when a case option had an empty block

Thanks to Kobayashi_Bairuo <noc@tohunet.com> for reporting.
This commit is contained in:
Maria Matejka 2023-06-22 16:07:28 +02:00
parent ac7341a181
commit 1499a335f6
3 changed files with 26 additions and 6 deletions

View File

@ -200,7 +200,7 @@ FID_INTERPRET_BODY()')
# Executing another filter line. This replaces the recursion # Executing another filter line. This replaces the recursion
# that was needed in the former implementation. # 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, `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].pos = 0;
fstk->estk[fstk->ecnt].line = $1; fstk->estk[fstk->ecnt].line = $1;
fstk->estk[fstk->ecnt].ventry = fstk->vcnt; 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 FID_ITERATE_BODY()m4_dnl
if (whati->fl$1) BUFFER_PUSH(fit->lines) = whati->fl$1; if (whati->fl$1) BUFFER_PUSH(fit->lines) = whati->fl$1;
FID_INTERPRET_EXEC()m4_dnl FID_INTERPRET_EXEC()m4_dnl
do { if (whati->fl$1) { LINEX_(whati->fl$1)
LINEX_(whati->fl$1);
} } while(0)
FID_INTERPRET_NEW()m4_dnl FID_INTERPRET_NEW()m4_dnl
return whati->f$1 return whati->f$1
FID_INTERPRET_BODY()') FID_INTERPRET_BODY()')

View File

@ -1327,7 +1327,6 @@
FID_HIC(,break,return NULL); FID_HIC(,break,return NULL);
} }
} }
/* It is actually possible to have t->data NULL */
LINEX(t->data); LINEX(t->data);
} }

View File

@ -38,6 +38,18 @@ bt_test_same(onef, onef, 1);
bt_test_same(onef, oneg, 1); bt_test_same(onef, oneg, 1);
bt_test_same(onef, twof, 0); 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 * 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 four = 4;
define xyzzy = (120+10); define xyzzy = (120+10);
define '1a-a1' = (xyzzy-100); define '1a-a1' = (xyzzy-100);
@ -120,7 +140,10 @@ function t_int()
else: bt_assert(false); 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"); bt_test_suite(t_int, "Testing integers");