| From 351a88feee66eda6ce33eb06acdebb8e9c6d6716 Mon Sep 17 00:00:00 2001 |
| From: Pavel Raiskup <praiskup@redhat.com> |
| Date: Fri, 18 Sep 2015 23:17:07 +0200 |
| Subject: [PATCH] libtoolize: fix infinite recursion in m4 |
| |
| Some projects use this construct in configure.ac: |
| |
| m4_define([version], m4_include([version])) |
| pkg_version=version |
| |
| When the m4_include builtin is undefined (as was done in |
| libtoolize and extract-trace scripts), the call to this 'version' |
| macro enters an infinite recursion (until ENOMEM). So rather |
| re-define all potentially dangerous macros by empty strings, |
| suggested by Eric Blake. |
| |
| While we are on it, merge the macro-"blacklist" with similar list |
| implemented in gettext, except for 'm4_esyscmd'. It's kept |
| defined because we already trace AC_INIT macro for package |
| version, while it is often specified by |
| m4_esyscmd(git-version-gen). Similarly to m4_include, m4_esyscmd |
| might be opt-in-blacklisted in future. |
| |
| References: |
| http://lists.gnu.org/archive/html/libtool/2015-09/msg00000.html |
| https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=764580 |
| |
| * gl/build-aux/extract-trace (_G_mini): Redefine trace-breaking |
| macros to empty strings rather than undefining those. Use 'dnl' |
| for comments. |
| * bootstrap: Likewise, sync with extract-trace. |
| * NEWS: Document. |
| * NO-THANKS: Mention Hiroyuki Sato. |
| |
| Signed-off-by: Pavel Raiskup <praiskup@redhat.com> |
| --- |
| NEWS | 4 ++++ |
| NO-THANKS | 1 + |
| bootstrap | 42 +++++++++++++++++++++++++++--------------- |
| build-aux/extract-trace | 42 +++++++++++++++++++++++++++--------------- |
| 4 files changed, 59 insertions(+), 30 deletions(-) |
| |
| diff --git a/gl/build-aux/extract-trace b/gl/build-aux/extract-trace |
| index 315a32a..c6abd21 100755 |
| --- a/build-aux/extract-trace |
| +++ b/build-aux/extract-trace |
| @@ -329,29 +329,41 @@ func_extract_trace () |
| # arguments to Autocof functions, but without following |
| # 'm4_s?include' files. |
| _G_mini=' |
| - # Initialisation. |
| + dnl Initialisation. |
| m4_changequote([,]) |
| m4_define([m4_copy], [m4_define([$2], m4_defn([$1]))]) |
| m4_define([m4_rename], [m4_copy([$1], [$2])m4_undefine([$1])]) |
| |
| - # Disable these macros. |
| - m4_undefine([m4_dnl]) |
| - m4_undefine([m4_include]) |
| - m4_undefine([m4_m4exit]) |
| - m4_undefine([m4_m4wrap]) |
| - m4_undefine([m4_maketemp]) |
| + dnl Replace macros which may abort m4 with a no-op variant. |
| + m4_pushdef([m4_assert]) |
| + m4_pushdef([m4_exit]) |
| + m4_pushdef([m4_fatal]) |
| + m4_pushdef([m4_m4exit]) |
| |
| - # Copy and rename macros not handled by "m4 --prefix". |
| + dnl Replace macros that might break stderr of m4. |
| + m4_pushdef([m4_errprint]) |
| + m4_pushdef([m4_errprintn]) |
| + m4_pushdef([m4_include]) |
| + m4_pushdef([m4_warn]) |
| + |
| + dnl Avoid side-effects of tracing by extract-trace. |
| + m4_pushdef([m4_maketemp]) |
| + m4_pushdef([m4_mkstemp]) |
| + |
| + dnl TODO: reasons for this |
| + m4_pushdef([m4_dnl]) |
| + m4_pushdef([m4_m4wrap]) |
| + |
| + dnl Copy and rename macros not handled by "m4 --prefix". |
| m4_define([dnl], [m4_builtin([dnl])]) |
| m4_copy([m4_define], [m4_defun]) |
| m4_rename([m4_ifelse], [m4_if]) |
| - m4_ifdef([m4_mkstemp], [m4_undefine([m4_mkstemp])]) |
| m4_rename([m4_patsubst], [m4_bpatsubst]) |
| m4_rename([m4_regexp], [m4_bregexp]) |
| |
| - # "m4sugar.mini" - useful m4-time macros for dynamic arguments. |
| - # If we discover packages that need more m4 macros defined in |
| - # order to bootstrap correctly, add them here: |
| + dnl "m4sugar.mini" - useful m4-time macros for dynamic arguments. |
| + dnl If we discover packages that need more m4 macros defined in |
| + dnl order to bootstrap correctly, add them here: |
| m4_define([m4_bmatch], |
| [m4_if([$#], 0, [], [$#], 1, [], [$#], 2, [$2], |
| [m4_if(m4_bregexp([$1], [$2]), -1, |
| @@ -362,11 +374,11 @@ func_extract_trace () |
| m4_define([m4_require], [$1]) |
| m4_define([m4_shift3], [m4_shift(m4shift(m4shift($@)))]) |
| |
| - # "autoconf.mini" - things from autoconf macros we care about. |
| + dnl "autoconf.mini" - things from autoconf macros we care about. |
| m4_copy([m4_defun], [AC_DEFUN]) |
| |
| - # Dummy definitions for the macros we want to trace. |
| - # AM_INIT_AUTOMAKE at least produces no trace without this. |
| + dnl Dummy definitions for the macros we want to trace. |
| + dnl AM_INIT_AUTOMAKE at least produces no trace without this. |
| ' |
| |
| _G_save=$IFS |
| -- |
| 2.6.2 |
| |