X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fhelpers.c;h=f247301cd7a2ba236871f8327c56a79ea144509f;hb=eb5cf99742db1b02cc5cac4be19226b58009a106;hp=43b86d7ca2ad953665522cf37f449b8046ffd3b7;hpb=7220240c0e2fa8c9610736565e73d3c74a73466c;p=ccan diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 43b86d7c..f247301c 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -9,6 +9,7 @@ #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) @@ -126,8 +127,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; }