From aede99584cb0d715ac3f7c41068bc88f09d2a61b Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Sun, 29 Oct 2006 18:45:56 +0000 Subject: make __dtoa & strtod() thread-safe useing the same method as newer gdtoa codebase. tested mostly by ckuethe and myself. __dtoa() use now requires a call to __freedtoa() --- src/lib/libc/stdlib/ecvt.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/lib/libc/stdlib/ecvt.c') diff --git a/src/lib/libc/stdlib/ecvt.c b/src/lib/libc/stdlib/ecvt.c index eb0e428996..719370a8f3 100644 --- a/src/lib/libc/stdlib/ecvt.c +++ b/src/lib/libc/stdlib/ecvt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ecvt.c,v 1.5 2006/01/10 16:18:37 millert Exp $ */ +/* $OpenBSD: ecvt.c,v 1.6 2006/10/29 18:45:56 deraadt Exp $ */ /* * Copyright (c) 2002, 2006 Todd C. Miller @@ -25,13 +25,14 @@ #include extern char *__dtoa(double, int, int, int *, int *, char **); +extern void __freedtoa(char *); static char *__cvt(double, int, int *, int *, int, int); static char * __cvt(double value, int ndigit, int *decpt, int *sign, int fmode, int pad) { static char *s; - char *p, *rve; + char *p, *rve, c; size_t siz; if (ndigit == 0) { @@ -64,15 +65,20 @@ __cvt(double value, int ndigit, int *decpt, int *sign, int fmode, int pad) if (*decpt == 9999) { /* Infinity or Nan, convert to inf or nan like printf */ *decpt = 0; - return(*p == 'I' ? "inf" : "nan"); + c = *p; + __freedtoa(p); + return(c == 'I' ? "inf" : "nan"); } /* Make a local copy and adjust rve to be in terms of s */ if (pad && fmode) siz += *decpt; - if ((s = (char *)malloc(siz)) == NULL) + if ((s = (char *)malloc(siz)) == NULL) { + __freedtoa(p); return(NULL); + } (void) strlcpy(s, p, siz); rve = s + (rve - p); + __freedtoa(p); } /* Add trailing zeros */ -- cgit v1.2.3-55-g6feb