From: Ondrej Zajicek Date: Fri, 5 Jun 2026 13:48:46 +0000 (+0200) Subject: Fix several issues in Flowspec handling X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;p=thirdparty%2Fbird.git Fix several issues in Flowspec handling The patch fixes several issues in Flowspec handling, namely: - Out-of-bounds read during flowspec validation - Rejection of NLRI for anomalies that MUST be ignored - Incorrect check of operand lengths - Broken label component construction - Broken formatting of IPv6 prefixes with specific offsets The first issue was reported by multiple people in recent time. The second issue found by Bronson Yen of Calif.io in collaboration with Claude and Anthropic Research. --- diff --git a/conf/flowspec.Y b/conf/flowspec.Y index de496ecbf..cdb578ac4 100644 --- a/conf/flowspec.Y +++ b/conf/flowspec.Y @@ -73,11 +73,11 @@ flow_srcdst: flow_num_opts: flow_num_op expr { - flow_check_cf_value_length(this_flow, $2); + flow_check_cf_numeric_arg(this_flow, $2); flow_builder_add_op_val(this_flow, $1, $2); } | flow_num_opts flow_logic_op flow_num_op expr { - flow_check_cf_value_length(this_flow, $4); + flow_check_cf_numeric_arg(this_flow, $4); flow_builder_add_op_val(this_flow, $2 | $3, $4); } | flow_num_opt_ext @@ -86,12 +86,12 @@ flow_num_opts: flow_num_opt_ext_expr: expr { - flow_check_cf_value_length(this_flow, $1); + flow_check_cf_numeric_arg(this_flow, $1); flow_builder_add_op_val(this_flow, FLOW_OP_EQ, $1); } | expr DDOT expr { - flow_check_cf_value_length(this_flow, $1); - flow_check_cf_value_length(this_flow, $3); + flow_check_cf_numeric_arg(this_flow, $1); + flow_check_cf_numeric_arg(this_flow, $3); flow_builder_add_op_val(this_flow, FLOW_OP_GEQ, $1); flow_builder_add_op_val(this_flow, FLOW_OP_AND | FLOW_OP_LEQ, $3); } @@ -104,15 +104,15 @@ flow_num_opt_ext: flow_bmk_opts: flow_neg expr '/' expr { - flow_check_cf_bmk_values(this_flow, $1, $2, $4); + flow_check_cf_bitmask_arg(this_flow, $1, $2, $4); flow_builder_add_val_mask(this_flow, $1, $2, $4); } | flow_bmk_opts flow_logic_op flow_neg expr '/' expr { - flow_check_cf_bmk_values(this_flow, $3, $4, $6); + flow_check_cf_bitmask_arg(this_flow, $3, $4, $6); flow_builder_add_val_mask(this_flow, $2 | $3, $4, $6); } | flow_bmk_opts ',' flow_neg expr '/' expr { - flow_check_cf_bmk_values(this_flow, $3, $4, $6); + flow_check_cf_bitmask_arg(this_flow, $3, $4, $6); flow_builder_add_val_mask(this_flow, 0x40 | $3, $4, $6); /* AND */ } ; diff --git a/doc/bird.sgml b/doc/bird.sgml index 3ba6fe2fe..51de0d97f 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -7100,7 +7100,6 @@ Note that for negated matches, value must be either zero or equal to bitmask