123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- 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
- --- bash-3.2/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
- --- bash-3.2/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
- --- bash-3.2/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_ */
|