From de474186bdb1a595bb77ccec577754134884bb52 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 30 Oct 2017 13:20:13 +0100 Subject: [PATCH] More robust object -> double conversion. Certain checks were useless, at the same time certain malformed inputs were accepted without problems (emtpy strings parsed as zero). Cases where strtod() returns ERANGE but we still want to parse the input where ok in getDoubleFromObject() but not in the long variant. As a side effect of these fixes, this commit fixes #4391. --- src/object.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/object.c b/src/object.c index 2565ed59..188ec010 100644 --- a/src/object.c +++ b/src/object.c @@ -558,11 +558,11 @@ int getDoubleFromObject(const robj *o, double *target) { if (sdsEncodedObject(o)) { errno = 0; value = strtod(o->ptr, &eptr); - if (isspace(((const char*)o->ptr)[0]) || + if (sdslen(o->ptr) == 0 || + isspace(((const char*)o->ptr)[0]) || eptr[0] != '\0' || (errno == ERANGE && (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) || - errno == EINVAL || isnan(value)) return C_ERR; } else if (o->encoding == OBJ_ENCODING_INT) { @@ -600,8 +600,12 @@ int getLongDoubleFromObject(robj *o, long double *target) { if (sdsEncodedObject(o)) { errno = 0; value = strtold(o->ptr, &eptr); - if (isspace(((char*)o->ptr)[0]) || eptr[0] != '\0' || - errno == ERANGE || isnan(value)) + if (sdslen(o->ptr) == 0 || + isspace(((const char*)o->ptr)[0]) || + eptr[0] != '\0' || + (errno == ERANGE && + (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) || + isnan(value)) return C_ERR; } else if (o->encoding == OBJ_ENCODING_INT) { value = (long)o->ptr;