From e30ed262092b809899bd545bc418719c5e8a384a Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sat, 1 Aug 2020 11:47:10 -0700
Subject: [PATCH] =?UTF-8?q?Fix=20regression=20that=20broke=20Automake=20?=
 =?UTF-8?q?=E2=80=98make=20check=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Problem reported by Ken Moffat (sr#110287); the problem was
introduced in 2016-12-21T16:15:46Z!daniel.kitta@gmail.com.
* bin/autoheader.in (templates_for_header):
When generating warnings about symbols lacking templates,
downgrade template read failure from a fatal error to a warning.
Also, don’t even try to read from a template file whose name has
shell metavariables (which Autoconf 2.50 withdrew support for);
just warn about that, too.  These changes cause the Automake
tests to merely generate warnings that are ignored, instead
of failing.
* doc/autoconf.texi (Configuration Files, Configuration Headers)
(Configuration Commands, Configuration Links):
Also document here that the file names should not contain
shell metacharacters, to make this constraint more obvious.
---
 bin/autoheader.in | 23 +++++++++++++++++------
 doc/autoconf.texi | 16 +++++++++++++---
 2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/bin/autoheader.in b/bin/autoheader.in
index 7d07fad1..bd824ea3 100644
--- a/bin/autoheader.in
+++ b/bin/autoheader.in
@@ -273,13 +273,24 @@ $out->close;
 {
   foreach my $template ("$tmp/config.hin", @config_templates)
     {
-      my $in = new Autom4te::XFile ($template, "<");
-
-      while ($_ = $in->getline)
+      if ($template =~ /["#\$&'()*;<>?[\\\^`|]/)
+	{
+	  msg 'syntax', "warning: header template has shell metacharacters: $template";
+	}
+      elsif (! -r $template)
+	{
+	  msg 'syntax', "warning: cannot read $template: $!";
+	}
+      else
 	{
-	  my ($sym) = /^\#\s*\w+\s+(\w+)/
-	    or next;
-	  delete $symbol{$sym};
+	  my $in = new Autom4te::XFile ($template, "<");
+
+	  while ($_ = $in->getline)
+	    {
+	      my ($sym) = /^\#\s*\w+\s+(\w+)/
+		or next;
+	      delete $symbol{$sym};
+	    }
 	}
     }
 
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 6ad4dca1..70d37834 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -2438,6 +2438,9 @@ AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
 Doing this allows you to keep your file names acceptable to
 DOS variants, or
 to prepend and/or append boilerplate to the file.
+
+The @var{file} names should not contain shell metacharacters.
+@xref{Special Chars in Variables}.
 @end defmac
 
 
@@ -3297,7 +3300,9 @@ Actions}.  Make @code{AC_OUTPUT} create the file(s) in the
 blank-or-newline-separated list @var{header} containing C preprocessor
 @code{#define} statements, and replace @samp{@@DEFS@@} in generated
 files with @option{-DHAVE_CONFIG_H} instead of the value of @code{DEFS}.
-The usual name for @var{header} is @file{config.h}.
+The usual name for @var{header} is @file{config.h};
+@var{header} should not contain shell metacharacters.
+@xref{Special Chars in Variables}.
 
 If @var{header} already exists and its contents are identical to what
 @code{AC_OUTPUT} would put in it, it is left alone.  Doing this allows
@@ -3617,7 +3622,9 @@ Specify additional shell commands to run at the end of
 from @command{configure}.  Associate the commands with @var{tag}.
 Since typically the @var{cmds} create a file, @var{tag} should
 naturally be the name of that file.  If needed, the directory hosting
-@var{tag} is created.  This macro is one of the instantiating macros;
+@var{tag} is created.  The @var{tag} should not contain shell
+metacharacters.  @xref{Special Chars in Variables}.
+This macro is one of the instantiating macros;
 see @ref{Configuration Actions}.
 
 Here is an unrealistic example:
@@ -3676,7 +3683,10 @@ Make @code{AC_OUTPUT} link each of the existing files @var{source} to
 the corresponding link name @var{dest}.  Makes a symbolic link if
 possible, otherwise a hard link if possible, otherwise a copy.  The
 @var{dest} and @var{source} names should be relative to the top level
-source or build directory.  This macro is one of the instantiating
+source or build directory, and should not contain shell metacharacters.
+@xref{Special Chars in Variables}.
+
+This macro is one of the instantiating
 macros; see @ref{Configuration Actions}.
 
 For example, this call:
-- 
2.17.1

