cfparser: CF_TIME - use strtod() instead atof()
authorMarko Kreen <markokr@gmail.com>
Tue, 5 Jun 2012 11:38:13 +0000 (14:38 +0300)
committerMarko Kreen <markokr@gmail.com>
Tue, 5 Jun 2012 11:38:13 +0000 (14:38 +0300)
It will give better error handling.

usual/cfparser.c

index c1207fb8534afc2204a34203a15f143321a84800..b03aa68feff59c16bcc125d65a48a0725530d260 100644 (file)
@@ -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;
 }