Tim Waugh 393b61
			     BASH PATCH REPORT
Tim Waugh 393b61
			     =================
Tim Waugh 393b61
Tim Waugh 393b61
Bash-Release: 3.2
Tim Waugh 393b61
Patch-ID: bash32-005
Tim Waugh 393b61
Tim Waugh 393b61
Bug-Reported-by:	Stuart Shelton <stuart@openobjects.com>
Tim Waugh 393b61
Bug-Reference-ID:	<453F7CC8.6030907@openobjects.com>
Tim Waugh 393b61
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00127.html
Tim Waugh 393b61
Tim Waugh 393b61
Bug-Description:
Tim Waugh 393b61
Tim Waugh 393b61
A missing extern declaration for `asprintf' caused `double' arguments to be
Tim Waugh 393b61
passed as `0', leading to incorrect results.  Additionally, a bug in the
Tim Waugh 393b61
replacement asprintf/snprintf function caused an infinite loop when passed
Tim Waugh 393b61
0 arguments to the floating point conversions under some circumstances.
Tim Waugh 393b61
Tim Waugh 393b61
Patch:
Tim Waugh 393b61
Tim Waugh 393b61
*** ../bash-3.2/builtins/printf.def	Mon Sep 18 08:48:42 2006
Tim Waugh 393b61
--- builtins/printf.def	Tue Oct 31 08:19:44 2006
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 49,54 ****
Tim Waugh 393b61
--- 49,60 ----
Tim Waugh 393b61
  #  define INT_MIN		(-2147483647-1)
Tim Waugh 393b61
  #endif
Tim Waugh 393b61
  
Tim Waugh 393b61
+ #if defined (PREFER_STDARG)
Tim Waugh 393b61
+ #  include <stdarg.h>
Tim Waugh 393b61
+ #else
Tim Waugh 393b61
+ #  include <varargs.h>
Tim Waugh 393b61
+ #endif
Tim Waugh 393b61
+ 
Tim Waugh 393b61
  #include <stdio.h>
Tim Waugh 393b61
  #include <chartypes.h>
Tim Waugh 393b61
  
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 151,156 ****
Tim Waugh 393b61
--- 157,166 ----
Tim Waugh 393b61
  #define SKIP1 "#'-+ 0"
Tim Waugh 393b61
  #define LENMODS "hjlLtz"
Tim Waugh 393b61
  
Tim Waugh 393b61
+ #ifndef HAVE_ASPRINTF
Tim Waugh 393b61
+ extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
Tim Waugh 393b61
+ #endif
Tim Waugh 393b61
+ 
Tim Waugh 393b61
  static void printf_erange __P((char *));
Tim Waugh 393b61
  static int printstr __P((char *, char *, int, int, int));
Tim Waugh 393b61
  static int tescape __P((char *, char *, int *));
Tim Waugh 393b61
Tim Waugh 393b61
Tim Waugh 393b61
*** ../bash-3.2/lib/sh/snprintf.c	Thu Apr  6 09:48:40 2006
Tim Waugh 393b61
--- lib/sh/snprintf.c	Sat Oct 28 00:00:13 2006
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 471,476 ****
Tim Waugh 393b61
--- 476,483 ----
Tim Waugh 393b61
  	  10^x ~= r
Tim Waugh 393b61
   * log_10(200) = 2;
Tim Waugh 393b61
   * log_10(250) = 2;
Tim Waugh 393b61
+  *
Tim Waugh 393b61
+  * NOTE: do not call this with r == 0 -- an infinite loop results.
Tim Waugh 393b61
   */
Tim Waugh 393b61
  static int
Tim Waugh 393b61
  log_10(r)
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 576,583 ****
Tim Waugh 393b61
      { 
Tim Waugh 393b61
        integral_part[0] = '0';
Tim Waugh 393b61
        integral_part[1] = '\0';
Tim Waugh 393b61
!       fraction_part[0] = '0';
Tim Waugh 393b61
!       fraction_part[1] = '\0';
Tim Waugh 393b61
        if (fract)
Tim Waugh 393b61
  	*fract = fraction_part;
Tim Waugh 393b61
        return integral_part;
Tim Waugh 393b61
--- 583,593 ----
Tim Waugh 393b61
      { 
Tim Waugh 393b61
        integral_part[0] = '0';
Tim Waugh 393b61
        integral_part[1] = '\0';
Tim Waugh 393b61
!       /* The fractional part has to take the precision into account */
Tim Waugh 393b61
!       for (ch = 0; ch < precision-1; ch++)
Tim Waugh 393b61
!  	fraction_part[ch] = '0';
Tim Waugh 393b61
!       fraction_part[ch] = '0';
Tim Waugh 393b61
!       fraction_part[ch+1] = '\0';
Tim Waugh 393b61
        if (fract)
Tim Waugh 393b61
  	*fract = fraction_part;
Tim Waugh 393b61
        return integral_part;
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 805,810 ****
Tim Waugh 393b61
--- 815,821 ----
Tim Waugh 393b61
        PUT_CHAR(*tmp, p);
Tim Waugh 393b61
        tmp++;
Tim Waugh 393b61
      }
Tim Waugh 393b61
+ 
Tim Waugh 393b61
    PAD_LEFT(p);
Tim Waugh 393b61
  }
Tim Waugh 393b61
  
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 972,982 ****
Tim Waugh 393b61
    if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
Tim Waugh 393b61
      tmp = t;
Tim Waugh 393b61
  
Tim Waugh 393b61
    /* calculate the padding. 1 for the dot */
Tim Waugh 393b61
    p->width = p->width -
Tim Waugh 393b61
  	    ((d > 0. && p->justify == RIGHT) ? 1:0) -
Tim Waugh 393b61
  	    ((p->flags & PF_SPACE) ? 1:0) -
Tim Waugh 393b61
! 	    strlen(tmp) - p->precision - 1;
Tim Waugh 393b61
    PAD_RIGHT(p);  
Tim Waugh 393b61
    PUT_PLUS(d, p, 0.);
Tim Waugh 393b61
    PUT_SPACE(d, p, 0.);
Tim Waugh 393b61
--- 983,1003 ----
Tim Waugh 393b61
    if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
Tim Waugh 393b61
      tmp = t;
Tim Waugh 393b61
  
Tim Waugh 393b61
+   if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
Tim Waugh 393b61
+     {
Tim Waugh 393b61
+       /* smash the trailing zeros unless altform */
Tim Waugh 393b61
+       for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
Tim Waugh 393b61
+         tmp2[i] = '\0'; 
Tim Waugh 393b61
+       if (tmp2[0] == '\0')
Tim Waugh 393b61
+ 	p->precision = 0;
Tim Waugh 393b61
+     }
Tim Waugh 393b61
+ 
Tim Waugh 393b61
    /* calculate the padding. 1 for the dot */
Tim Waugh 393b61
    p->width = p->width -
Tim Waugh 393b61
  	    ((d > 0. && p->justify == RIGHT) ? 1:0) -
Tim Waugh 393b61
  	    ((p->flags & PF_SPACE) ? 1:0) -
Tim Waugh 393b61
! 	    strlen(tmp) - p->precision -
Tim Waugh 393b61
! 	    ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0);	/* radix char */
Tim Waugh 393b61
    PAD_RIGHT(p);  
Tim Waugh 393b61
    PUT_PLUS(d, p, 0.);
Tim Waugh 393b61
    PUT_SPACE(d, p, 0.);
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 991,1001 ****
Tim Waugh 393b61
    if (p->precision != 0 || (p->flags & PF_ALTFORM))
Tim Waugh 393b61
      PUT_CHAR(decpoint, p);  /* put the '.' */
Tim Waugh 393b61
  
Tim Waugh 393b61
-   if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
Tim Waugh 393b61
-     /* smash the trailing zeros unless altform */
Tim Waugh 393b61
-     for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
Tim Waugh 393b61
-       tmp2[i] = '\0'; 
Tim Waugh 393b61
- 
Tim Waugh 393b61
    for (; *tmp2; tmp2++)
Tim Waugh 393b61
      PUT_CHAR(*tmp2, p); /* the fraction */
Tim Waugh 393b61
    
Tim Waugh 393b61
--- 1012,1017 ----
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 1011,1024 ****
Tim Waugh 393b61
    char *tmp, *tmp2;
Tim Waugh 393b61
    int j, i;
Tim Waugh 393b61
  
Tim Waugh 393b61
!   if (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))
Tim Waugh 393b61
      return;	/* already printed nan or inf */
Tim Waugh 393b61
  
Tim Waugh 393b61
    GETLOCALEDATA(decpoint, thoussep, grouping);
Tim Waugh 393b61
    DEF_PREC(p);
Tim Waugh 393b61
!   j = log_10(d);
Tim Waugh 393b61
!   d = d / pow_10(j);  /* get the Mantissa */
Tim Waugh 393b61
!   d = ROUND(d, p);		  
Tim Waugh 393b61
    tmp = dtoa(d, p->precision, &tmp2);
Tim Waugh 393b61
  
Tim Waugh 393b61
    /* 1 for unit, 1 for the '.', 1 for 'e|E',
Tim Waugh 393b61
--- 1027,1045 ----
Tim Waugh 393b61
    char *tmp, *tmp2;
Tim Waugh 393b61
    int j, i;
Tim Waugh 393b61
  
Tim Waugh 393b61
!   if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2)))
Tim Waugh 393b61
      return;	/* already printed nan or inf */
Tim Waugh 393b61
  
Tim Waugh 393b61
    GETLOCALEDATA(decpoint, thoussep, grouping);
Tim Waugh 393b61
    DEF_PREC(p);
Tim Waugh 393b61
!   if (d == 0.)
Tim Waugh 393b61
!     j = 0;
Tim Waugh 393b61
!   else
Tim Waugh 393b61
!     {
Tim Waugh 393b61
!       j = log_10(d);
Tim Waugh 393b61
!       d = d / pow_10(j);  /* get the Mantissa */
Tim Waugh 393b61
!       d = ROUND(d, p);		  
Tim Waugh 393b61
!     }
Tim Waugh 393b61
    tmp = dtoa(d, p->precision, &tmp2);
Tim Waugh 393b61
  
Tim Waugh 393b61
    /* 1 for unit, 1 for the '.', 1 for 'e|E',
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 1076,1081 ****
Tim Waugh 393b61
--- 1097,1103 ----
Tim Waugh 393b61
         PUT_CHAR(*tmp, p);
Tim Waugh 393b61
         tmp++;
Tim Waugh 393b61
       }
Tim Waugh 393b61
+ 
Tim Waugh 393b61
     PAD_LEFT(p);
Tim Waugh 393b61
  }
Tim Waugh 393b61
  #endif
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 1358,1364 ****
Tim Waugh 393b61
  		STAR_ARGS(data);
Tim Waugh 393b61
  		DEF_PREC(data);
Tim Waugh 393b61
  		d = GETDOUBLE(data);
Tim Waugh 393b61
! 		i = log_10(d);
Tim Waugh 393b61
  		/*
Tim Waugh 393b61
  		 * for '%g|%G' ANSI: use f if exponent
Tim Waugh 393b61
  		 * is in the range or [-4,p] exclusively
Tim Waugh 393b61
--- 1380,1386 ----
Tim Waugh 393b61
  		STAR_ARGS(data);
Tim Waugh 393b61
  		DEF_PREC(data);
Tim Waugh 393b61
  		d = GETDOUBLE(data);
Tim Waugh 393b61
! 		i = (d != 0.) ? log_10(d) : -1;
Tim Waugh 393b61
  		/*
Tim Waugh 393b61
  		 * for '%g|%G' ANSI: use f if exponent
Tim Waugh 393b61
  		 * is in the range or [-4,p] exclusively
Tim Waugh 393b61
*** ../bash-3.2/patchlevel.h	Thu Apr 13 08:31:04 2006
Tim Waugh 393b61
--- patchlevel.h	Mon Oct 16 14:22:54 2006
Tim Waugh 393b61
***************
Tim Waugh 393b61
*** 26,30 ****
Tim Waugh 393b61
     looks for to find the patch level (for the sccs version string). */
Tim Waugh 393b61
  
Tim Waugh 393b61
! #define PATCHLEVEL 4
Tim Waugh 393b61
  
Tim Waugh 393b61
  #endif /* _PATCHLEVEL_H_ */
Tim Waugh 393b61
--- 26,30 ----
Tim Waugh 393b61
     looks for to find the patch level (for the sccs version string). */
Tim Waugh 393b61
  
Tim Waugh 393b61
! #define PATCHLEVEL 5
Tim Waugh 393b61
  
Tim Waugh 393b61
  #endif /* _PATCHLEVEL_H_ */