From: Ralf Wildenhues Date: Tue, 4 Mar 2008 21:25:48 +0000 (+0000) Subject: * libltdl/config/ltmain.m4sh (func_mode_execute): Replace only X-Git-Tag: v2.2.2~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c7644ca3a66d9ba974a97c88261c21f2daa63d4;p=thirdparty%2Flibtool.git * libltdl/config/ltmain.m4sh (func_mode_execute): Replace only arguments we have identified as shell or C wrappers. (func_emit_wrapper): Output error message on stderr. * tests/execute-mode.at: New file, with --mode=execute tests. * Makefile.am: Adjust. * NEWS: Update. Fixes 2.2 regression. Report by Roberto Bagnara. --- diff --git a/ChangeLog b/ChangeLog index a391da609..f37276e21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-03-04 Ralf Wildenhues + * libltdl/config/ltmain.m4sh (func_mode_execute): Replace only + arguments we have identified as shell or C wrappers. + (func_emit_wrapper): Output error message on stderr. + * tests/execute-mode.at: New file, with --mode=execute tests. + * Makefile.am: Adjust. + * NEWS: Update. + Fixes 2.2 regression. Report by Roberto Bagnara. + * libltdl/m4/libtool.m4 (_LT_CONFIG): Drop misleading `GNU' prefix before the host package name in the "Generated by" line for the libtool script. diff --git a/Makefile.am b/Makefile.am index ae82e2367..771c8efe3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -447,6 +447,7 @@ TESTSUITE_AT = tests/testsuite.at \ tests/search-path.at \ tests/indirect_deps.at \ tests/archive-in-archive.at \ + tests/execute-mode.at \ tests/destdir.at \ tests/old-m4-iface.at \ tests/am-subdir.at \ diff --git a/NEWS b/NEWS index 8d490f7f9..80c4ebda2 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ New in 2.3b: 2008-??-??: CVS version 2.3a, Libtool team: - Fix 2.2 regression in libltdl that causes memory corruption upon repeated `lt_dlinit(); lt_dlexit()'. + - Fix 2.2 regression in that `libtool --mode=execute CMD ARGS' does not + transform ARGS that do not look like shell or C wrappers of libtool + programs. New in 2.2: 2008-03-01; CVS version 2.1c, Libtool team: diff --git a/libltdl/config/ltmain.m4sh b/libltdl/config/ltmain.m4sh index 1fc5a3bca..0d0d8a6f5 100644 --- a/libltdl/config/ltmain.m4sh +++ b/libltdl/config/ltmain.m4sh @@ -1694,12 +1694,14 @@ func_mode_execute () # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" fi - # Transform arg to wrapped name. - file="$progdir/$program" ;; esac # Quote arguments (to preserve shell metacharacters). @@ -2468,7 +2470,7 @@ else ;; esac $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 fi else diff --git a/tests/execute-mode.at b/tests/execute-mode.at new file mode 100644 index 000000000..257e9d3c8 --- /dev/null +++ b/tests/execute-mode.at @@ -0,0 +1,92 @@ +# execute-mode.at -- libtool --mode=execute -*- Autotest -*- +# +# Copyright (C) 2008 Free Software Foundation, Inc. +# Written by Ralf Wildenhues, 2008 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +#### + +AT_SETUP([execute mode]) +AT_KEYWORDS([libtool]) + +AT_DATA([foo], +[[#! /bin/sh +if test $# -gt 0; then + echo "$@" +else + : +fi +]]) + +AT_DATA([lt-wrapper], +[[#! /bin/sh +# Generated by GNU libtool. +# fake wrapper script. +program=lt-real +progdir=. +if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + exec "$progdir/$program" ${1+"$@"} + echo "$0: cannot exec $program $*" >&2 + exit 1 +fi +]]) + +AT_DATA([lt-real], +[[#! /bin/sh +echo "$@" +]]) + +mkdir sub +cp foo sub/foo +chmod +x foo sub/foo lt-wrapper lt-real + +AT_CHECK([$LIBTOOL --mode=execute ./foo]) +AT_CHECK([$LIBTOOL --mode=execute sub/foo]) +AT_CHECK([$LIBTOOL --mode=execute ./foo foo], [], [foo +]) +AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper foo], [], [foo +]) +AT_CHECK([cd sub && $LIBTOOL --mode=execute ./foo ../foo], [], [../foo +]) +# suppose that ./foo is gdb, and lt-wrapper is the wrapper script. +AT_CHECK([$LIBTOOL --mode=execute ./foo lt-wrapper bar baz], [], + [./lt-real bar baz +]) + +# Check that a missing real program causes an error. +# The error message and code are likely to be 126, +# "No such file or directory" but system-dependent. +mv -f lt-real lt-backup +AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper foo || exit 1], + [1], [ignore], [ignore]) +mv -f lt-backup lt-real + +# Now use arguments that require decent quoting. +AT_CHECK([$LIBTOOL --mode=execute ./foo "arg with special chars: \$!&*\`'()"], + [], [arg with special chars: $!&*`'() +]) +AT_CHECK([$LIBTOOL --mode=execute ./lt-wrapper "arg with special chars: \$!&*\`'()"], + [], [arg with special chars: $!&*`'() +]) +AT_CHECK([$LIBTOOL --mode=execute ./foo lt-wrapper "arg with special chars: \$!&*\`'()"], + [], [./lt-real arg with special chars: $!&*`'() +]) + +AT_CLEANUP