From 93f5529731b91f4821d2c59888a51b936b266a4e Mon Sep 17 00:00:00 2001 From: Ralf Wildenhues Date: Wed, 9 Dec 2009 07:28:59 +0100 Subject: [PATCH] Improve parsing of .la files in libltdl. * libltdl/ltdl.c (trim): Do not dump core upon missing quote in module .la file. * tests/lalib-syntax.at (syntax of .la files): New file, new test. * Makefile.am (TESTSUITE_AT): Add tests/lalib-syntax.at. Report by Bob Friesenhahn. Signed-off-by: Ralf Wildenhues --- ChangeLog | 10 ++++ Makefile.am | 1 + libltdl/ltdl.c | 2 +- tests/lalib-syntax.at | 125 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 tests/lalib-syntax.at diff --git a/ChangeLog b/ChangeLog index ca5e947be..fd6ded04d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-12-09 Ralf Wildenhues + + Improve parsing of .la files in libltdl. + * libltdl/ltdl.c (trim): Do not dump core upon missing quote in + module .la file. + * tests/lalib-syntax.at (syntax of .la files): New file, new + test. + * Makefile.am (TESTSUITE_AT): Add tests/lalib-syntax.at. + Report by Bob Friesenhahn. + 2009-12-05 Ralf Wildenhues Sane fallback initialization of $ECHO from $as_echo. diff --git a/Makefile.am b/Makefile.am index e5d55eba1..5c570b5a4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -484,6 +484,7 @@ TESTSUITE_AT = tests/testsuite.at \ tests/lt_dlopen_a.at \ tests/lt_dlopenext.at \ tests/ltdl-api.at \ + tests/lalib-syntax.at \ tests/slist.at \ tests/need_lib_prefix.at \ tests/standalone.at \ diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index e2accff44..d180e3054 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -994,7 +994,7 @@ trim (char **dest, const char *str) FREE (*dest); - if (!end) + if (!end || end == str) return 1; if (len > 3 && str[0] == '\'') diff --git a/tests/lalib-syntax.at b/tests/lalib-syntax.at new file mode 100644 index 000000000..65d6b554c --- /dev/null +++ b/tests/lalib-syntax.at @@ -0,0 +1,125 @@ +# lalib-syntax.at -- parsing .la files robustly -*- Autotest -*- +# +# Copyright (C) 2009 Free Software Foundation, Inc. +# +# 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([syntax of .la files]) +AT_KEYWORDS([libtool]) +AT_KEYWORDS([libltdl]) + +AT_DATA([main.c], +[[#include +#include + +int +main (int argc, char* argv[]) +{ + int err = 0; + lt_dlhandle plugin_handle; + + if (argc < 2) + { + fprintf (stderr, "usage: %s plugin\n", argv[0]); + return 1; + } + + lt_dlinit (); + plugin_handle = lt_dlopenext (argv[1]); + if (NULL != plugin_handle) + { + printf ("plugin opened successfully!\n"); + lt_dlclose (plugin_handle); + } + else + { + printf ("plugin failed to open: %s\n", lt_dlerror()); + err = 1; + } + lt_dlexit (); + return err; +} +]]) + +AT_DATA([module.c], +[[int foo (void) { return 0; } +]]) + +: ${LTDLINCL="-I$abs_top_srcdir/libltdl"} +: ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"} +CPPFLAGS="$CPPFLAGS $LTDLINCL" + +AT_CHECK([$CC $CPPFLAGS $CFLAGS -c main.c], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c module.c], + [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o module.la module.lo ]dnl + [-module -avoid-version -rpath /somewhere], [], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT $LIBLTDL], + [], [ignore], [ignore]) + + +# Several bogus test cases. + +AT_DATA([missing-closing-quote.la], +[[# missing-closing-quote.la - a libtool library file +# Generated by libtool +dlname='module.so +library_names='module.so module.so module.so' +old_library='module.a' +installed=no +shouldnotlink=yes +libdir='/somewhere' +]]) + +AT_DATA([wrong-quotes.la], +[[# wrong-quotes.la - a libtool library file +# Generated by libtool +dlname="module.so" +library_names='module.so module.so module.so' +old_library='module.a' +installed=no +shouldnotlink=yes +libdir='/somewhere' +]]) + +AT_DATA([no-dlname.la], +[[# no-dlname.la - a libtool library file +# Generated by libtool +installed=no +shouldnotlink=yes +libdir='/somewhere' +]]) + +AT_DATA([nonexistent-dlname.la], +[[# nonexistent-dlname.la - a libtool library file +# Generated by libtool +dlname='does-not-exist.so' +installed=no +shouldnotlink=yes +libdir='/somewhere' +]]) + +for file in ./missing-closing-quote.la ./wrong-quotes.la \ + ./no-dlname.la ./nonexistent-dlname.la; do + LT_AT_EXEC_CHECK([./main], [1], [stdout], [ignore], [$file]) + AT_CHECK([grep 'plugin failed to open' stdout], [], [ignore]) +done + +AT_CLEANUP -- 2.47.2