Download raw body.
bgpd: fix various flowspec parser issues
This is a collection of fixes to the flowspec bits in parse.y
- handle PROTO proto_item like PROTO { proto_item }.
- extra semicolon after flags
- The LENGTH spec needs to be adjusted, curflow->type needs to be set
before evaluating lengthspec.
- Twice $$ is used in error checking before $$ was set. Use $1 instead.
--
:wq Claudio
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v
diff -u -p -r1.496 parse.y
--- parse.y 13 May 2026 09:25:11 -0000 1.496
+++ parse.y 18 May 2026 09:32:46 -0000
@@ -1221,7 +1221,11 @@ flowspec : FLOWSPEC af {
}
;
-proto : PROTO proto_item
+proto : PROTO proto_item {
+ curflow->type = FLOWSPEC_TYPE_PROTO;
+ if (push_unary_numop(OP_EQ, $2) == -1)
+ YYERROR;
+ }
| PROTO '{' optnl proto_list optnl '}'
;
@@ -1337,11 +1341,11 @@ flowrule : from
} flags
| FRAGMENT {
curflow->type = FLOWSPEC_TYPE_FRAG;
- } flags;
+ } flags
| icmpspec
- | LENGTH lengthspec {
+ | LENGTH {
curflow->type = FLOWSPEC_TYPE_PKT_LEN;
- }
+ } lengthspec
| proto
| TOS tos {
curflow->type = FLOWSPEC_TYPE_DSCP;
@@ -1473,7 +1477,7 @@ tos : STRING {
free($1);
}
| NUMBER {
- if ($$ < 0 || $$ > 255) {
+ if ($1 < 0 || $1 > 255) {
yyerror("illegal tos value %lld", $1);
YYERROR;
}
@@ -1504,7 +1508,7 @@ length_item : length {
;
length : NUMBER {
- if ($$ < 0 || $$ > USHRT_MAX) {
+ if ($1 < 0 || $1 > USHRT_MAX) {
yyerror("illegal ptk length value %lld", $1);
YYERROR;
}
bgpd: fix various flowspec parser issues