Replace the bionic hack for a vfprintf leak with (roughly) the upstream fix.

Currently in bionic free and freedtoa are equivalent, but that's not true
of gdtoa. This makes it easier to test gdtoa without having to replace
everything. (Yes, I found this bug the hard way.)

Change-Id: I290823a2a0a83329def5f2719b349215ad0dbbde
This commit is contained in:
Elliott Hughes
2014-04-11 18:00:37 -07:00
parent a0b3232161
commit 5eb670462a

View File

@@ -146,6 +146,7 @@ __sbprintf(FILE *fp, const char *fmt, va_list ap)
#define DEFPREC 6
static char *cvt(double, int, int, char *, int *, int, int *);
extern void freedtoa(char *);
static int exponent(char *, int, int);
#else /* no FLOATING_POINT */
#define BUF 40
@@ -201,7 +202,6 @@ __vfprintf(FILE *fp, const char *fmt0, __va_list ap)
int ch; /* character from fmt */
int n, m, n2; /* handy integers (short term usage) */
char *cp; /* handy char pointer (short term usage) */
char *cp_free = NULL; /* BIONIC: copy of cp to be freed after usage */
struct __siov *iovp; /* for PRINT macro */
int flags; /* flags as above */
int ret; /* return value accumulator */
@@ -218,6 +218,7 @@ __vfprintf(FILE *fp, const char *fmt0, __va_list ap)
int expsize = 0; /* character count for expstr */
int ndig; /* actual number of digits returned by cvt */
char expstr[7]; /* buffer for exponent string */
char *dtoaresult = NULL;
#endif
uintmax_t _umax; /* integer arguments %[diouxX] */
@@ -555,10 +556,10 @@ reswitch: switch (ch) {
break;
}
if (dtoaresult != NULL) freedtoa(dtoaresult);
flags |= FPT;
cp = cvt(_double, prec, flags, &softsign,
dtoaresult = cp = cvt(_double, prec, flags, &softsign,
&expt, ch, &ndig);
cp_free = cp;
if (ch == 'g' || ch == 'G') {
if (expt <= -4 || expt > prec)
ch = (ch == 'g') ? 'e' : 'E';
@@ -845,21 +846,14 @@ number: if ((dprec = prec) >= 0)
ret += width > realsz ? width : realsz;
FLUSH(); /* copy out the I/O vectors */
#if 1 /* BIONIC: remove memory leak when printing doubles */
if (cp_free) {
free(cp_free);
cp_free = NULL;
}
#endif
}
done:
FLUSH();
error:
#if 1 /* BIONIC: remove memory leak when printing doubles */
if (cp_free) {
free(cp_free);
cp_free = NULL;
}
#ifdef FLOATING_POINT
if (dtoaresult != NULL) {
freedtoa(dtoaresult);
}
#endif
if (argtable != NULL && argtable != statargtable) {
munmap(argtable, argtablesiz);