]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Avoid shell parse errors after interrupt due to empty ``.
authorJim Meyering <jim@meyering.net>
Tue, 19 Aug 2008 21:00:09 +0000 (23:00 +0200)
committerRalf Wildenhues <Ralf.Wildenhues@gmx.de>
Tue, 19 Aug 2008 21:00:51 +0000 (23:00 +0200)
* doc/autoconf.texi (Shell Substitutions): Document the issue.
* lib/m4sugar/m4sh.m4 (AS_VAR_IF): New function.
* lib/autoconf/functions.m4 (AC_CHECK_FUNC): Use it in place of
"test AS_VAR_GET([...]) = yes"
* lib/autoconf/general.m4 (AC_CHECK_FILE, AC_CHECK_DECL): Likewise.
* lib/autoconf/headers.m4 (_AC_CHECK_HEADER_MONGREL): Likewise.
(_AC_CHECK_HEADER_NEW, _AC_CHECK_HEADER_OLD): Likewise.
(_AC_CHECK_HEADER_DIRENT): Likewise.
* lib/autoconf/libs.m4 (AC_CHECK_LIB): Likewise.
* lib/autoconf/types.m4 (_AC_CHECK_TYPE_NEW, AC_CHECK_MEMBER): Likewise.
* lib/autoconf/status.m4 (_AC_OUTPUT_FILES_PREPARE): Use
temporary variable to work around the issue.
* tests/foreign.at (Libtool): Quote result of command
substitution.

Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
ChangeLog
doc/autoconf.texi
lib/autoconf/functions.m4
lib/autoconf/general.m4
lib/autoconf/headers.m4
lib/autoconf/libs.m4
lib/autoconf/status.m4
lib/autoconf/types.m4
lib/m4sugar/m4sh.m4
tests/foreign.at

index 562e9e14d91b593b9f07b86cc807743a834577fd..b9c14bc7f0442f3ab3514d109958154ad5b296c6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2008-08-19  Jim Meyering  <jim@meyering.net>
+           Eric Blake  <ebb9@byu.net>
+           Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+       Avoid shell parse errors after interrupt due to empty ``.
+       * doc/autoconf.texi (Shell Substitutions): Document the issue.
+       * lib/m4sugar/m4sh.m4 (AS_VAR_IF): New function.
+       * lib/autoconf/functions.m4 (AC_CHECK_FUNC): Use it in place of
+       "test AS_VAR_GET([...]) = yes"
+       * lib/autoconf/general.m4 (AC_CHECK_FILE, AC_CHECK_DECL): Likewise.
+       * lib/autoconf/headers.m4 (_AC_CHECK_HEADER_MONGREL): Likewise.
+       (_AC_CHECK_HEADER_NEW, _AC_CHECK_HEADER_OLD): Likewise.
+       (_AC_CHECK_HEADER_DIRENT): Likewise.
+       * lib/autoconf/libs.m4 (AC_CHECK_LIB): Likewise.
+       * lib/autoconf/types.m4 (_AC_CHECK_TYPE_NEW, AC_CHECK_MEMBER): Likewise.
+       * lib/autoconf/status.m4 (_AC_OUTPUT_FILES_PREPARE): Use
+       temporary variable to work around the issue.
+       * tests/foreign.at (Libtool): Quote result of command
+       substitution.
+
 2008-08-18  Eric Blake  <ebb9@byu.net>
 
        Test m4_transform without tickling shell bugs.
index 2ce88f807e6adbc37113774ec1c11fe42f283ade..739bd4759ffdef4c35cced8d15cd1ca629fc35cd 100644 (file)
@@ -13479,6 +13479,26 @@ $ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken}
 - broken differ: char 4, line 1
 @end example
 
+Upon interrupt or SIGTERM, some shells may abort a command substitution,
+replace it with a null string, and wrongly evaluate the enclosing
+command before entering the trap or ending the script.  This can lead to
+spurious errors:
+
+@example
+$ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'}
+$ @kbd{^C}
+sh: test: hi: unexpected operator/operand
+@end example
+
+@noindent
+You can avoid this by assigning the command substitution to a temporary
+variable:
+
+@example
+$ @kbd{sh -c 'res=`sleep 5; echo hi`
+         if test "x$res" = xhi; then echo yes; fi'}
+$ @kbd{^C}
+@end example
 
 @item $(@var{commands})
 @cindex $(@var{commands})
index 78c76788f8279f1d763017adeac37c1581578859..c325f3045deef64d37304803486b8aec34430e2c 100644 (file)
@@ -70,7 +70,7 @@ AC_CACHE_CHECK([for $1], [ac_var],
 [AC_LINK_IFELSE([AC_LANG_FUNC_LINK_TRY([$1])],
                [AS_VAR_SET([ac_var], [yes])],
                [AS_VAR_SET([ac_var], [no])])])
-AS_IF([test AS_VAR_GET([ac_var]) = yes], [$2], [$3])dnl
+AS_VAR_IF([ac_var], [yes], [$2], [$3])dnl
 AS_VAR_POPDEF([ac_var])dnl
 ])# AC_CHECK_FUNC
 
index 8af0dc422ef52b3170ad6939dcecd35376c50d59..265d78bf4d4b4f659f8863dc035f0b42a43f1918 100644 (file)
@@ -2614,7 +2614,7 @@ if test -r "$1"; then
 else
   AS_VAR_SET([ac_File], [no])
 fi])
-AS_IF([test AS_VAR_GET([ac_File]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_File], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_File])dnl
 ])# AC_CHECK_FILE
 
@@ -2651,7 +2651,7 @@ AC_CACHE_CHECK([whether $1 is declared], [ac_Symbol],
 ])],
                   [AS_VAR_SET([ac_Symbol], [yes])],
                   [AS_VAR_SET([ac_Symbol], [no])])])
-AS_IF([test AS_VAR_GET([ac_Symbol]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Symbol], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Symbol])dnl
 ])# AC_CHECK_DECL
 
index 476df374de18b2c1acc62c5391f727f30c0d6be5..16b2737be8d5aaa1b0ec1564cab2658183bb54ec 100644 (file)
@@ -143,7 +143,7 @@ esac
 AC_CACHE_CHECK([for $1], [ac_Header],
               [AS_VAR_SET([ac_Header], [$ac_header_preproc])])
 ])dnl ! set ac_HEADER
-AS_IF([test AS_VAR_GET([ac_Header]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Header], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Header])dnl
 ])# _AC_CHECK_HEADER_MONGREL
 
@@ -160,7 +160,7 @@ AC_CACHE_CHECK([for $1], [ac_Header],
 @%:@include <$1>])],
                                  [AS_VAR_SET([ac_Header], [yes])],
                                  [AS_VAR_SET([ac_Header], [no])])])
-AS_IF([test AS_VAR_GET([ac_Header]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Header], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Header])dnl
 ])# _AC_CHECK_HEADER_NEW
 
@@ -175,7 +175,7 @@ AC_CACHE_CHECK([for $1], [ac_Header],
               [AC_PREPROC_IFELSE([AC_LANG_SOURCE([@%:@include <$1>])],
                                         [AS_VAR_SET([ac_Header], [yes])],
                                         [AS_VAR_SET([ac_Header], [no])])])
-AS_IF([test AS_VAR_GET([ac_Header]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Header], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Header])dnl
 ])# _AC_CHECK_HEADER_OLD
 
@@ -403,7 +403,7 @@ AC_CACHE_CHECK([for $1 that defines DIR], [ac_Header],
 return 0;])],
                   [AS_VAR_SET([ac_Header], [yes])],
                   [AS_VAR_SET([ac_Header], [no])])])
-AS_IF([test AS_VAR_GET([ac_Header]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Header], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Header])dnl
 ])# _AC_CHECK_HEADER_DIRENT
 
index 429918c7033b96f0b5fa942d8667b39a496a8383..a1b8cfe2313370c9abb3bbfcb3d2d408b5084c65 100644 (file)
@@ -130,7 +130,7 @@ AC_LINK_IFELSE([AC_LANG_CALL([], [$2])],
               [AS_VAR_SET([ac_Lib], [yes])],
               [AS_VAR_SET([ac_Lib], [no])])
 LIBS=$ac_check_lib_save_LIBS])
-AS_IF([test AS_VAR_GET([ac_Lib]) = yes],
+AS_VAR_IF([ac_Lib], [yes],
       [m4_default([$3], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1))
   LIBS="-l$1 $LIBS"
 ])],
index 48974612610fd0226195be1af305df41ad78a86f..af16f79701bdd4f6961a3f584c05528264e57b36 100644 (file)
@@ -419,7 +419,8 @@ for ac_last_try in false false false false false :; do
     AC_MSG_ERROR([could not make $CONFIG_STATUS])
 
 dnl Do not use grep on conf$$subs.awk, since AIX grep has a line length limit.
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
     break
   elif $ac_last_try; then
     AC_MSG_ERROR([could not make $CONFIG_STATUS])
index 50a489c49351d07e9a42c682e22767d5d83c1fd0..0ab85a597432713473db04da346e0283cce013e9 100644 (file)
@@ -160,7 +160,7 @@ AC_COMPILE_IFELSE(
          return 0;])],
      [],
      [AS_VAR_SET([ac_Type], [yes])])])])
-AS_IF([test AS_VAR_GET([ac_Type]) = yes], [$2], [$3])[]dnl
+AS_VAR_IF([ac_Type], [yes], [$2], [$3])[]dnl
 AS_VAR_POPDEF([ac_Type])dnl
 ])# _AC_CHECK_TYPE_NEW
 
@@ -834,7 +834,7 @@ if (sizeof ac_aggr.m4_bpatsubst([$1], [^[^.]*\.]))
 return 0;])],
                [AS_VAR_SET([ac_Member], [yes])],
                [AS_VAR_SET([ac_Member], [no])])])])
-AS_IF([test AS_VAR_GET([ac_Member]) = yes], [$2], [$3])dnl
+AS_VAR_IF([ac_Member], [yes], [$2], [$3])dnl
 AS_VAR_POPDEF([ac_Member])dnl
 ])# AC_CHECK_MEMBER
 
index 1517630986c001d3428d33cad1ca8edb6c671d6b..5aab9c7940b25a53a71b1f073f432c8761bc510b 100644 (file)
@@ -1576,6 +1576,17 @@ m4_define([AS_VAR_SET_IF],
 [AS_IF([AS_VAR_TEST_SET([$1])], [$2], [$3])])
 
 
+# AS_VAR_IF(VARIABLE, VALUE, IF-TRUE, IF-FALSE)
+# ---------------------------------------------
+# Implement a shell `if test $VARIABLE = VALUE; then-else'.
+# Polymorphic, and avoids sh expansion error upon interrupt or term signal.
+m4_define([AS_VAR_IF],
+[AS_LITERAL_IF([$1],
+  [AS_IF([test "x$$1" = x""$2], [$3], [$4])],
+  [as_val=AS_VAR_GET([$1])
+   AS_IF([test "x$as_val" = x""$2], [$3], [$4])])])
+
+
 # AS_VAR_PUSHDEF and AS_VAR_POPDEF
 # --------------------------------
 #
index e4cc89d6419f071a9d94d9bca72aeac9cb014974..43ada94dfdf57c797bb95914550d221553856f46 100644 (file)
@@ -69,7 +69,7 @@ AT_CHECK([test -f "`cat stdout`"])
 touch install-sh
 
 # Build the concatenation of libtool.m4 and configure.ac.
-cp `cat stdout` configure.in
+cp "`cat stdout`" configure.in
 cat >>configure.in <<_EOF
 AC_INIT
 AC_CONFIG_AUX_DIR(.)