bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

subtle bug in close, fclose, open, strstr modules


From: Bruno Haible
Subject: subtle bug in close, fclose, open, strstr modules
Date: Tue, 11 Aug 2009 00:02:16 +0200
User-agent: KMail/1.9.9

In some autoconf macros, we tried to optimize invocations to AC_LIBOBJ.
The idiom, such as found in strstr.m4, is that the default value of
REPLACE_STRSTR is 0, and when REPLACE_STRSTR is 1, we need to organize
to compile strstr.c. Some "clever" optimization was to execute the
AC_LIBOBJ only the first time. i.e. only when REPLACE_STRSTR was 0. Bug!

In gettext, I use two gnulib-tool invocations under the roof of the same
configure.ac. So it has two gnulib-tool generated macros

  AC_DEFUN([gl_INIT], [
    ... prepare for AC_LIBOBJ to append to gl_LIBOBJS
    ...
    gl_FUNC_STRSTR
    ...
  ])

  AC_DEFUN([gtpo_INIT], [
    ... prepare for AC_LIBOBJ to append to gtpo_LIBOBJS
    ...
    gl_FUNC_STRSTR
    ...
  ])

The optimization causes strstr.o to be added to gl_LIBOBJS but
not to gtpo_LIBOBJS, leading to a link error (because other modules
in gtpo really need to call strstr, and the string.h replacement
has a #define strstr rpl_strstr).

I'm applying this fix.


2009-08-10  Bruno Haible  <address@hidden>

        Don't optimize AC_LIBOBJs, as they may appear in different contexts.
        * m4/close.m4 (gl_REPLACE_CLOSE): Execute AC_LIBOBJ unconditionally,
        not only the first time.
        * m4/fclose.m4 (gl_REPLACE_FCLOSE): Likewise.
        * m4/open.m4 (gl_REPLACE_OPEN): Likewise.
        * m4/strstr.m4 (gl_FUNC_STRSTR): Execute AC_LIBOBJ when REPLACE_STRSTR
        is 1, not only the the first time.

--- m4/close.m4.orig    2009-08-10 23:49:22.000000000 +0200
+++ m4/close.m4 2009-08-10 23:40:05.000000000 +0200
@@ -1,4 +1,4 @@
-# close.m4 serial 4
+# close.m4 serial 5
 dnl Copyright (C) 2008-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -20,9 +20,7 @@
 AC_DEFUN([gl_REPLACE_CLOSE],
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
-  if test $REPLACE_CLOSE != 1; then
-    AC_LIBOBJ([close])
-  fi
   REPLACE_CLOSE=1
+  AC_LIBOBJ([close])
   gl_REPLACE_FCLOSE
 ])
--- m4/fclose.m4.orig   2009-08-10 23:49:22.000000000 +0200
+++ m4/fclose.m4        2009-08-10 23:40:25.000000000 +0200
@@ -1,5 +1,5 @@
-# fclose.m4 serial 1
-dnl Copyright (C) 2008 Free Software Foundation, Inc.
+# fclose.m4 serial 2
+dnl Copyright (C) 2008-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -11,8 +11,6 @@
 AC_DEFUN([gl_REPLACE_FCLOSE],
 [
   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  if test $REPLACE_FCLOSE != 1; then
-    AC_LIBOBJ([fclose])
-  fi
   REPLACE_FCLOSE=1
+  AC_LIBOBJ([fclose])
 ])
--- m4/open.m4.orig     2009-08-10 23:49:22.000000000 +0200
+++ m4/open.m4  2009-08-10 23:39:35.000000000 +0200
@@ -1,4 +1,4 @@
-# open.m4 serial 6
+# open.m4 serial 7
 dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -51,11 +51,9 @@
 AC_DEFUN([gl_REPLACE_OPEN],
 [
   AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
-  if test $REPLACE_OPEN != 1; then
-    AC_LIBOBJ([open])
-    gl_PREREQ_OPEN
-  fi
   REPLACE_OPEN=1
+  AC_LIBOBJ([open])
+  gl_PREREQ_OPEN
 ])
 
 # Prerequisites of lib/open.c.
--- m4/strstr.m4.orig   2009-08-10 23:49:22.000000000 +0200
+++ m4/strstr.m4        2009-08-10 23:42:51.000000000 +0200
@@ -1,4 +1,4 @@
-# strstr.m4 serial 6
+# strstr.m4 serial 7
 dnl Copyright (C) 2008, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -71,7 +71,9 @@
       ])
     if test "$gl_cv_func_strstr_linear" != yes; then
       REPLACE_STRSTR=1
-      AC_LIBOBJ([strstr])
     fi
   fi
+  if test $REPLACE_STRSTR = 1; then
+    AC_LIBOBJ([strstr])
+  fi
 ]) # gl_FUNC_STRSTR




reply via email to

[Prev in Thread] Current Thread [Next in Thread]