From 8640fb6cd0016816c8d7389ec766b0585df9da1c Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Tue, 5 Jun 2012 14:38:13 +0300 Subject: [PATCH] cfparser: CF_TIME - use strtod() instead atof() It will give better error handling. --- usual/cfparser.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/usual/cfparser.c b/usual/cfparser.c index c1207fb..b03aa68 100644 --- a/usual/cfparser.c +++ b/usual/cfparser.c @@ -440,17 +440,40 @@ fail: return false; } +/* parse float with error checking. returns -1 if failed */ +static double parse_time(const char *value) +{ + double v; + char *endp = NULL; + + errno = 0; + v = strtod(value, &endp); + if (errno) + return -1; + if (*endp || endp == value || v < 0) { + errno = EINVAL; + return -1; + } + return v; +} + bool cf_set_time_usec(struct CfValue *cv, const char *value) { usec_t *ptr = cv->value_p; - *ptr = USEC * atof(value); + double v = parse_time(value); + if (v < 0) + return false; + *ptr = USEC * v; return true; } bool cf_set_time_double(struct CfValue *cv, const char *value) { double *ptr = cv->value_p; - *ptr = atof(value); + double v = parse_time(value); + if (v < 0) + return false; + *ptr = v; return true; } -- 2.39.5