aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpconv.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/fpconv.c b/fpconv.c
index 3bcef41..9f8cb87 100644
--- a/fpconv.c
+++ b/fpconv.c
@@ -81,6 +81,7 @@ static int strtod_buffer_size(const char *s)
81 * character. Guaranteed to be called at the start of any valid number in a string */ 81 * character. Guaranteed to be called at the start of any valid number in a string */
82double fpconv_strtod(const char *nptr, char **endptr) 82double fpconv_strtod(const char *nptr, char **endptr)
83{ 83{
84 char localbuf[FPCONV_G_FMT_BUFSIZE];
84 char *buf, *endbuf, *dp; 85 char *buf, *endbuf, *dp;
85 int buflen; 86 int buflen;
86 double value; 87 double value;
@@ -97,10 +98,16 @@ double fpconv_strtod(const char *nptr, char **endptr)
97 } 98 }
98 99
99 /* Duplicate number into buffer */ 100 /* Duplicate number into buffer */
100 buf = malloc(buflen + 1); 101 if (buflen >= FPCONV_G_FMT_BUFSIZE) {
101 if (!buf) { 102 /* Handle unusually large numbers */
102 fprintf(stderr, "Out of memory"); 103 buf = malloc(buflen + 1);
103 abort(); 104 if (!buf) {
105 fprintf(stderr, "Out of memory");
106 abort();
107 }
108 } else {
109 /* This is the common case.. */
110 buf = localbuf;
104 } 111 }
105 memcpy(buf, nptr, buflen); 112 memcpy(buf, nptr, buflen);
106 buf[buflen] = 0; 113 buf[buflen] = 0;
@@ -112,7 +119,8 @@ double fpconv_strtod(const char *nptr, char **endptr)
112 119
113 value = strtod(buf, &endbuf); 120 value = strtod(buf, &endbuf);
114 *endptr = (char *)&nptr[endbuf - buf]; 121 *endptr = (char *)&nptr[endbuf - buf];
115 free(buf); 122 if (buflen >= FPCONV_G_FMT_BUFSIZE)
123 free(buf);
116 124
117 return value; 125 return value;
118} 126}