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