diff --git a/regress/usr.sbin/btrace/Makefile b/regress/usr.sbin/btrace/Makefile index 29f90cef4..e1d399910 100644 --- a/regress/usr.sbin/btrace/Makefile +++ b/regress/usr.sbin/btrace/Makefile @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile,v 1.27 2023/08/13 09:49:47 mpi Exp $ +# $OpenBSD: Makefile,v 1.28 2023/08/28 21:23:46 dv Exp $ BTRACE?= /usr/sbin/btrace ALLOWDT!= sysctl -n kern.allowdt 2>/dev/null # scripts that don't need /dev/dt -BT_LANG_SCRIPTS= arithm beginend boolean comments delete exit \ - histempty if \ +BT_LANG_SCRIPTS= arithm beginend beginend-argn boolean comments delete \ + exit histempty if \ map mapclear mapempty mapsyntax mapzero map-unnamed \ maxoperand min+max+sum multismts nsecs+var \ precedence print read-map-after-clear staticv-empty \ diff --git a/regress/usr.sbin/btrace/beginend-argn.bt b/regress/usr.sbin/btrace/beginend-argn.bt new file mode 100644 index 000000000..7260ad401 --- /dev/null +++ b/regress/usr.sbin/btrace/beginend-argn.bt @@ -0,0 +1,8 @@ +// Test catching invalid use of argN in BEGIN and END contexts. +BEGIN { + print(arg0); +} + +END { + print(arg0); +} diff --git a/regress/usr.sbin/btrace/beginend-argn.ok b/regress/usr.sbin/btrace/beginend-argn.ok new file mode 100644 index 000000000..3c0fb6780 --- /dev/null +++ b/regress/usr.sbin/btrace/beginend-argn.ok @@ -0,0 +1,6 @@ +beginend-argn.bt:3:11: the arg0 builtin cannot be used with BEGIN or END probes: + print(arg0); + ^ +beginend-argn.bt:7:11: the arg0 builtin cannot be used with BEGIN or END probes: + print(arg0); + ^ diff --git a/usr.sbin/btrace/bt_parse.y b/usr.sbin/btrace/bt_parse.y index 959f6e4a4..b2c3bef3b 100644 --- a/usr.sbin/btrace/bt_parse.y +++ b/usr.sbin/btrace/bt_parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: bt_parse.y,v 1.50 2023/08/13 13:19:23 dv Exp $ */ +/* $OpenBSD: bt_parse.y,v 1.51 2023/08/28 21:23:46 dv Exp $ */ /* * Copyright (c) 2019-2021 Martin Pieuchot @@ -109,7 +109,8 @@ typedef struct { static void yyerror(const char *, ...); static int yylex(void); -static int pflag; +static int pflag = 0; /* probe parsing context flag */ +static int beflag = 0; /* BEGIN/END parsing context flag */ %} %token ERROR ENDFILT @@ -137,7 +138,7 @@ grammar : /* empty */ | grammar error ; -rule : plist filter action { br_new($1, $2, $3); } +rule : plist filter action { br_new($1, $2, $3); beflag = 0; } ; beginend: BEGIN | END ; @@ -147,7 +148,7 @@ plist : plist ',' probe { $$ = bp_append($1, $3); } ; probe : { pflag = 1; } pname { $$ = $2; pflag = 0; } - | beginend { $$ = bp_new(NULL, NULL, NULL, $1); } + | { beflag = 1; } beginend { $$ = bp_new(NULL, NULL, NULL, $2); } ; pname : STRING ':' STRING ':' STRING { $$ = bp_new($1, $3, $5, 0); } @@ -962,6 +963,12 @@ again: yylval.v.string = kwp->word; return STRING; } + } else if (beflag) { + /* Interpret tokens in a BEGIN/END context. */ + if (kwp->type >= B_AT_BI_ARG0 && + kwp->type <= B_AT_BI_ARG9) + yyerror("the %s builtin cannot be used with " + "BEGIN or END probes", kwp->word); } yylval.v.i = kwp->type; return kwp->token;