bug-gnulib
[Top][All Lists]
Advanced

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

Re: [PATCH] Re: buggy vfprintf makes printf(1) segfault on freebsd 5.0


From: Bruno Haible
Subject: Re: [PATCH] Re: buggy vfprintf makes printf(1) segfault on freebsd 5.0
Date: Sat, 3 Nov 2007 05:44:21 +0100
User-agent: KMail/1.5.4

Jim Meyering wrote:
> I think I'll have to resort to using a moderately large width, yet
> with limited virtual memory, e.g., via ulimit -v 10000.

Here is the beginning of a proposal for m4/printf.m4 along these lines.

*** m4/printf.m4.orig   2007-11-03 05:38:54.000000000 +0100
--- m4/printf.m4        2007-11-03 03:01:53.000000000 +0100
***************
*** 1,4 ****
! # printf.m4 serial 17
  dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc.
  dnl This file is free software; the Free Software Foundation
  dnl gives unlimited permission to copy and/or distribute it,
--- 1,4 ----
! # printf.m4 serial 18
  dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc.
  dnl This file is free software; the Free Software Foundation
  dnl gives unlimited permission to copy and/or distribute it,
***************
*** 721,726 ****
--- 721,823 ----
      ])
  ])
  
+ dnl Test whether the *printf family of functions recovers gracefully in case
+ dnl of an out-of-memory condition, or whether it crashes the entire program.
+ dnl Result is gl_cv_func_printf_enomem.
+ 
+ AC_DEFUN([gl_PRINTF_ENOMEM]
+ [
+   AC_REQUIRE([AC_PROG_CC])
+   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
+     [gl_cv_func_printf_enomem],
+     [
+       if test "$cross_compiling" != no; then
+         AC_LANG_CONFTEST([AC_LANG_SOURCE([
+ changequote(,)dnl
+ #include <stdio.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/resource.h>
+ #include <errno.h>
+ int main()
+ {
+   struct rlimit limit;
+   int ret;
+   /* Some printf implementations allocate temporary space with malloc.  */
+   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
+ #ifdef RLIMIT_DATA
+   if (getrlimit (RLIMIT_DATA, &limit) < 0)
+     return 77;
+   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 1000000)
+     limit.rlim_max = 1000000;
+   limit.rlim_cur = limit.rlim_max;
+   if (setrlimit (RLIMIT_DATA, &limit) < 0)
+     return 77;
+ #endif
+   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
+ #ifdef RLIMIT_AS
+   if (getrlimit (RLIMIT_AS, &limit) < 0)
+     return 77;
+   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 1000000)
+     limit.rlim_max = 1000000;
+   limit.rlim_cur = limit.rlim_max;
+   if (setrlimit (RLIMIT_AS, &limit) < 0)
+     return 77;
+ #endif
+   /* Some printf implementations allocate temporary space on the stack.  */
+ #ifdef RLIMIT_STACK
+   if (getrlimit (RLIMIT_STACK, &limit) < 0)
+     return 77;
+   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 1000000)
+     limit.rlim_max = 1000000;
+   limit.rlim_cur = limit.rlim_max;
+   if (setrlimit (RLIMIT_STACK, &limit) < 0)
+     return 77;
+ #endif
+   ret = printf ("%.1000000f", 1.0);
+   return !(ret == 1000002 || (ret < 0 && errno == ENOMEM));
+ }
+ changequote([,])dnl
+           ])])
+         if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+           (./conftest) >/dev/null 2>/dev/null
+           case $? in
+             0) gl_cv_func_printf_enomem="yes" ;;
+             77) gl_cv_func_printf_enomem="guessing no" ;;
+             *) gl_cv_func_printf_enomem="no" ;;
+           esac
+         else
+           gl_cv_func_printf_enomem="guessing no" ;;
+         fi
+         rm -fr conftest*
+       else
+ changequote(,)dnl
+         case "$host_os" in
+                   # Guess yes on glibc systems.
+           *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
+                   # Guess yes on AIX.
+           aix*)   gl_cv_func_printf_enomem="guessing yes";;
+                   # Guess yes on HP-UX/hppa.
+           hpux*)  case "$host_cpu" in
+                     hppa*) gl_cv_func_printf_enomem="guessing yes";;
+                     *)     gl_cv_func_printf_enomem="guessing no";;
+                   esac
+                   ;;
+                   # Guess yes on IRIX.
+           irix*)  gl_cv_func_printf_enomem="guessing yes";;
+                   # Guess yes on OSF/1.
+           osf*)   gl_cv_func_printf_enomem="guessing yes";;
+                   # Guess yes on BeOS.
+           beos*)  gl_cv_func_printf_enomem="guessing yes";;
+                   # If we don't know, assume the worst.
+           *)      gl_cv_func_printf_enomem="guessing no";;
+         esac
+ changequote([,])dnl
+       fi
+     ])
+ ])
+ 
  dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
  dnl Result is ac_cv_func_snprintf.
  
***************
*** 1039,1049 ****
  dnl 8 = gl_PRINTF_POSITIONS
  dnl 9 = gl_PRINTF_FLAG_GROUPING
  dnl 10 = gl_PRINTF_FLAG_ZERO
! dnl 11 = gl_SNPRINTF_PRESENCE
! dnl 12 = gl_SNPRINTF_TRUNCATION_C99
! dnl 13 = gl_SNPRINTF_RETVAL_C99
! dnl 14 = gl_SNPRINTF_DIRECTIVE_N
! dnl 15 = gl_VSNPRINTF_ZEROSIZE_C99
  dnl
  dnl 1 = checking whether printf supports size specifiers as in C99...
  dnl 2 = checking whether printf supports 'long double' arguments...
--- 1136,1147 ----
  dnl 8 = gl_PRINTF_POSITIONS
  dnl 9 = gl_PRINTF_FLAG_GROUPING
  dnl 10 = gl_PRINTF_FLAG_ZERO
! dnl 11 = gl_PRINTF_ENOMEM
! dnl 12 = gl_SNPRINTF_PRESENCE
! dnl 13 = gl_SNPRINTF_TRUNCATION_C99
! dnl 14 = gl_SNPRINTF_RETVAL_C99
! dnl 15 = gl_SNPRINTF_DIRECTIVE_N
! dnl 16 = gl_VSNPRINTF_ZEROSIZE_C99
  dnl
  dnl 1 = checking whether printf supports size specifiers as in C99...
  dnl 2 = checking whether printf supports 'long double' arguments...
***************
*** 1055,1087 ****
  dnl 8 = checking whether printf supports POSIX/XSI format strings with 
positions...
  dnl 9 = checking whether printf supports the grouping flag...
  dnl 10 = checking whether printf supports the zero flag correctly...
! dnl 11 = checking for snprintf...
! dnl 12 = checking whether snprintf truncates the result as in C99...
! dnl 13 = checking whether snprintf returns a byte count as in C99...
! dnl 14 = checking whether snprintf fully supports the 'n' directive...
! dnl 15 = checking whether vsnprintf respects a zero size as in C99...
  dnl
  dnl . = yes, # = no.
  dnl
! dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 
15
! dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  . 
 .
! dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  . 
 .
! dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  #  .  .  .  . 
 .
! dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  #  .  .  .  . 
 .
! dnl   OpenBSD 3.9, 4.0               .  ?  ?  ?  #  ?  .  .  ?  ?  .  .  .  ? 
 ?
! dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  #  .  .  .  . 
 .
! dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  #  .  .  .  . 
 .
! dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  #  .  .  .  . 
 .
! dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  #  .  .  .  . 
 .
! dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  #  #  #  #  # 
 #
! dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  #  .  .  .  . 
 .
! dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  #  .  .  .  . 
 .
! dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  #  .  .  #  # 
 .
! dnl   HP-UX 10.20, 11.{00,11,23}     #  .  .  .  #  #  .  .  .  #  .  .  #  # 
 #
! dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  #  .  .  #  . 
 .
! dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  #  .  .  #  . 
 #
! dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  #  #  #  #  # 
 #
! dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  .  .  .  ? 
 ?
! dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  #  .  .  .  . 
 .
! dnl   BeOS                           #  #  .  #  #  #  .  #  .  .  .  .  .  . 
 .
! dnl   mingw                          #  #  #  #  #  #  .  #  #  #  .  #  #  # 
 .
--- 1153,1186 ----
  dnl 8 = checking whether printf supports POSIX/XSI format strings with 
positions...
  dnl 9 = checking whether printf supports the grouping flag...
  dnl 10 = checking whether printf supports the zero flag correctly...
! dnl 11 = checking whether printf survives out-of-memory conditions...
! dnl 12 = checking for snprintf...
! dnl 13 = checking whether snprintf truncates the result as in C99...
! dnl 14 = checking whether snprintf returns a byte count as in C99...
! dnl 15 = checking whether snprintf fully supports the 'n' directive...
! dnl 16 = checking whether vsnprintf respects a zero size as in C99...
  dnl
  dnl . = yes, # = no.
  dnl
! dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 
15 16
! dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  . 
 .  .
! dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  . 
 .  .
! dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  #  #  .  .  . 
 .  .
! dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  #  #  .  .  . 
 .  .
! dnl   OpenBSD 3.9, 4.0               .  ?  ?  ?  #  ?  .  .  ?  ?  ?  .  .  . 
 ?  ?
! dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  #  ?  .  .  . 
 .  .
! dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  #  ?  .  .  . 
 .  .
! dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  #  #  .  .  . 
 .  .
! dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  #  .  .  .  . 
 .  .
! dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  #  .  #  #  # 
 #  #
! dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  #  .  .  .  . 
 .  .
! dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  #  .  .  .  . 
 .  .
! dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  #  .  .  .  # 
 #  .
! dnl   HP-UX 10.20, 11.{00,11,23}     #  .  .  .  #  #  .  .  .  #  .  .  .  # 
 #  #
! dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  #  .  .  .  # 
 .  .
! dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  #  .  .  .  # 
 .  #
! dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  #  .  #  #  # 
 #  #
! dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  ?  .  .  . 
 ?  ?
! dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  #  #  .  .  . 
 .  .
! dnl   BeOS                           #  #  .  #  #  #  .  #  .  .  ?  .  .  . 
 .  .
! dnl   mingw                          #  #  #  #  #  #  .  #  #  #  ?  .  #  # 
 #  .





reply via email to

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