* [nft PATCH v2] parser_bison: Fix for bison < 3.6
@ 2026-06-11 12:52 Phil Sutter
2026-07-23 10:09 ` Phil Sutter
0 siblings, 1 reply; 2+ messages in thread
From: Phil Sutter @ 2026-06-11 12:52 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter-devel, Jan Kończak
Support for 'custom' parse.error value was added in bison-3.6. Fall back
to previous value for earlier versions.
This is harder to get right than it seems: On one hand, preprocessor
macros can't be used in parser_bison.y's declaration section and
automake forbids conditional changes to AM_YFLAGS on the other.
Another aspect complicating things is compiling with (an up to date)
parser_bison.c in place vs. without: Dist tarballs generally have it in
place, relieving users from having to provide a YACC when compiling. The
existing parser_bison.c either uses parse.error=custom or not which does
not (should not) change when compiling. Hiding yyreport_syntax_error()
behind a CPPFLAG which may be set or not depending on bison presence and
version then causes trouble if it doesn't match how parser_bison.c was
created.
Avoid these pitfalls by:
- Not relying upon a preprocessor define to control parser_bison.c
compilation, instead check existence of the bison-internal
YY_LAC_ESTABLISH macro
- Exporting the above macro existence check in a variable for use by
main.c (thereby crossing the libnftables library boundary)
Also:
- Introduce have_prebuilt_bison variable in configure.ac, unifying the
parser_bison.c existence check and solidify the latter by also
comparing its timestamp
- Report extended parser errors enableval in configure only if
parser_bison.c will be recreated, otherwise we can't quite tell if it
will turn out to be enabled or not
Suggested-by: Jan Kończak <jan.konczak@cs.put.poznan.pl>
Fixes: 67b822f2b2624 ("parser_bison: on syntax errors, output expected tokens")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
Changes since v1:
- Report extended parser error support in 'nft -V' and configure output
- Fix for recompiling with changed extended-parser-errors configure
option
- Fix for tarball compiling without bison presence
- Document the antics in the commit message
---
Makefile.am | 5 +++++
configure.ac | 22 +++++++++++++++++++++-
include/nftables/libnftables.h | 2 ++
src/libnftables.map | 4 ++++
src/main.c | 14 ++++++++------
src/parser_bison.y | 9 +++++++--
6 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index fa71e06eefee5..5778dd29828e1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -164,6 +164,11 @@ AM_CFLAGS = \
$(NULL)
AM_YFLAGS = -d -Wno-yacc
+if BISON_CUSTOM_ERROR
+YACC += -D parse.error=custom -D parse.lac=full
+else
+YACC += -D parse.error=verbose
+endif
if BUILD_PROFILING
AM_CFLAGS += --coverage
diff --git a/configure.ac b/configure.ac
index 0d3ee2ac89f69..d0eb7829bf604 100644
--- a/configure.ac
+++ b/configure.ac
@@ -32,7 +32,11 @@ AC_PROG_SED
AC_PROG_LEX([noyywrap])
AC_PROG_YACC
-if test -z "$ac_cv_prog_YACC" -a ! -f "${srcdir}/src/parser_bison.c"
+p_bison_pfx="${srcdir}/src/parser_bison"
+if test -f "${p_bison_pfx}.c" -a "${p_bison_pfx}.c" -nt "${p_bison_pfx}.y"
+then
+ have_prebuilt_bison="yes"
+elif test -z "$ac_cv_prog_YACC"
then
echo "*** Error: No suitable bison/yacc found. ***"
echo " Please install the 'bison' package."
@@ -45,6 +49,18 @@ then
exit 1
fi
+AC_ARG_ENABLE([extended_parser_errors],
+ AS_HELP_STRING([--disable-extended-parser-errors],
+ [Disable use of parse.error=custom and LAC in Bison]),
+ [], [
+ enable_extended_parser_errors=no
+ AC_SUBST([BISON], [$ac_cv_prog_YACC])
+ AX_PROG_BISON_VERSION([3.6],
+ [enable_extended_parser_errors=yes])
+ ])
+AM_CONDITIONAL([BISON_CUSTOM_ERROR],
+ [test "x$enable_extended_parser_errors" != xno])
+
AM_PROG_AR
LT_INIT([disable-static])
AC_EXEEXT
@@ -180,6 +196,10 @@ echo "
json output support: ${with_json}
collect profiling data: ${enable_profiling}"
+if test "x$have_prebuilt_bison" != "xyes"; then
+echo " extended parser errors: ${enable_extended_parser_errors}"
+fi
+
if test "x$unitdir" != "x"; then
AC_SUBST([unitdir])
echo " systemd unit: ${unitdir}"
diff --git a/include/nftables/libnftables.h b/include/nftables/libnftables.h
index c1d48d765a423..90b3f1b84a66f 100644
--- a/include/nftables/libnftables.h
+++ b/include/nftables/libnftables.h
@@ -99,6 +99,8 @@ void nft_ctx_clear_vars(struct nft_ctx *ctx);
int nft_run_cmd_from_buffer(struct nft_ctx *nft, const char *buf);
int nft_run_cmd_from_filename(struct nft_ctx *nft, const char *filename);
+extern bool nft_bison_have_extended_errors;
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/libnftables.map b/src/libnftables.map
index 9369f44f35367..55c64f40e6a28 100644
--- a/src/libnftables.map
+++ b/src/libnftables.map
@@ -38,3 +38,7 @@ LIBNFTABLES_4 {
nft_ctx_input_get_flags;
nft_ctx_input_set_flags;
} LIBNFTABLES_3;
+
+LIBNFTABLES_5 {
+ nft_bison_have_extended_errors;
+} LIBNFTABLES_4;
diff --git a/src/main.c b/src/main.c
index 4cb51ff7f5fef..976410b05fba8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -237,7 +237,7 @@ static void show_help(const char *name)
static void show_version(void)
{
- const char *cli, *minigmp, *json, *xt;
+ const char *cli, *minigmp, *json, *xt, *ext_bsn_err;
#if defined(HAVE_LIBREADLINE)
cli = "readline";
@@ -266,14 +266,16 @@ static void show_version(void)
#else
xt = "no";
#endif
+ ext_bsn_err = nft_bison_have_extended_errors ? "yes" : "no";
printf("%s v%s (%s)\n"
- " cli: %s\n"
- " json: %s\n"
- " minigmp: %s\n"
- " libxtables: %s\n",
+ " cli: %s\n"
+ " json: %s\n"
+ " minigmp: %s\n"
+ " libxtables: %s\n"
+ " extended parser errors: %s\n",
PACKAGE_NAME, PACKAGE_VERSION, RELEASE_NAME,
- cli, json, minigmp, xt);
+ cli, json, minigmp, xt, ext_bsn_err);
}
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 5a334bf0c4997..800a4bda3760f 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -221,8 +221,6 @@ int nft_lex(void *, void *, void *);
%parse-param { void *scanner }
%parse-param { struct parser_state *state }
%lex-param { scanner }
-%define parse.error custom
-%define parse.lac full
%locations
%initial-action {
@@ -6537,6 +6535,7 @@ exthdr_key : HBH close_scope_hbh { $$ = IPPROTO_HOPOPTS; }
%%
+#ifdef YY_LAC_ESTABLISH
static int
yyreport_syntax_error(const yypcontext_t *yyctx, struct nft_ctx *nft,
void *scanner, struct parser_state *state)
@@ -6592,3 +6591,9 @@ yyreport_syntax_error(const yypcontext_t *yyctx, struct nft_ctx *nft,
free(msg);
return 0;
}
+
+bool nft_bison_have_extended_errors = true;
+#else /* ! YY_LAC_ESTABLISH */
+bool nft_bison_have_extended_errors = false;
+#endif /* YY_LAC_ESTABLISH */
+EXPORT_SYMBOL(nft_bison_have_extended_errors);
--
2.54.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [nft PATCH v2] parser_bison: Fix for bison < 3.6
2026-06-11 12:52 [nft PATCH v2] parser_bison: Fix for bison < 3.6 Phil Sutter
@ 2026-07-23 10:09 ` Phil Sutter
0 siblings, 0 replies; 2+ messages in thread
From: Phil Sutter @ 2026-07-23 10:09 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter-devel, Jan Kończak
On Thu, Jun 11, 2026 at 02:52:25PM +0200, Phil Sutter wrote:
> Support for 'custom' parse.error value was added in bison-3.6. Fall back
> to previous value for earlier versions.
>
> This is harder to get right than it seems: On one hand, preprocessor
> macros can't be used in parser_bison.y's declaration section and
> automake forbids conditional changes to AM_YFLAGS on the other.
>
> Another aspect complicating things is compiling with (an up to date)
> parser_bison.c in place vs. without: Dist tarballs generally have it in
> place, relieving users from having to provide a YACC when compiling. The
> existing parser_bison.c either uses parse.error=custom or not which does
> not (should not) change when compiling. Hiding yyreport_syntax_error()
> behind a CPPFLAG which may be set or not depending on bison presence and
> version then causes trouble if it doesn't match how parser_bison.c was
> created.
>
> Avoid these pitfalls by:
> - Not relying upon a preprocessor define to control parser_bison.c
> compilation, instead check existence of the bison-internal
> YY_LAC_ESTABLISH macro
> - Exporting the above macro existence check in a variable for use by
> main.c (thereby crossing the libnftables library boundary)
>
> Also:
> - Introduce have_prebuilt_bison variable in configure.ac, unifying the
> parser_bison.c existence check and solidify the latter by also
> comparing its timestamp
> - Report extended parser errors enableval in configure only if
> parser_bison.c will be recreated, otherwise we can't quite tell if it
> will turn out to be enabled or not
>
> Suggested-by: Jan Kończak <jan.konczak@cs.put.poznan.pl>
> Fixes: 67b822f2b2624 ("parser_bison: on syntax errors, output expected tokens")
> Signed-off-by: Phil Sutter <phil@nwl.cc>
Patch applied.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-23 10:09 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-11 12:52 [nft PATCH v2] parser_bison: Fix for bison < 3.6 Phil Sutter
2026-07-23 10:09 ` Phil Sutter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.