X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fhelpers.c;h=118e543602e06b981e6faee7dd5f416cf819d5cd;hb=33ba12adf082b9432ae0471b6bb742cde14254ed;hp=43b86d7ca2ad953665522cf37f449b8046ffd3b7;hpb=7220240c0e2fa8c9610736565e73d3c74a73466c;p=ccan diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 43b86d7c..118e5436 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -9,14 +9,14 @@ #include #include #include "private.h" +#include /* Upper bound to sprintf this simple type? Each 3 bits < 1 digit. */ #define CHAR_SIZE(type) (((sizeof(type)*CHAR_BIT + 2) / 3) + 1) -/* FIXME: asprintf module? */ static char *arg_bad(const char *fmt, const char *arg) { - char *str = malloc(strlen(fmt) + strlen(arg)); + char *str = opt_alloc.alloc(strlen(fmt) + strlen(arg)); sprintf(str, fmt, arg); return str; } @@ -126,8 +126,14 @@ char *opt_set_floatval(const char *arg, float *f) return err; *f = d; - if (*f != d) - return arg_bad("'%s' is out of range", arg); + + /*allow true infinity via --foo=INF, while avoiding isinf() from math.h + because it wasn't standard 25 years ago.*/ + double inf = 1e300 * 1e300; /*direct 1e600 annoys -Woverflow*/ + if ((d > FLT_MAX || d < -FLT_MAX) && d != inf && d != -inf) + return arg_bad("'%s' is out of range for a 32 bit float", arg); + if (d != 0 && *f == 0) + return arg_bad("'%s' is out of range (truncated to zero)", arg); return NULL; }