From d87549636609d2a01722eb6ad185cd4666d04ebb Mon Sep 17 00:00:00 2001 From: Gerhard Sittig Date: Thu, 19 Jul 2018 22:12:15 +0200 Subject: [PATCH] strutil: insist in some mantissa for parse rational The previous implementation accepted either empty integer or empty fractional parts of a floating point number, but also when both parts were missing ("." input). Insist in at least one of the parts to be present. --- src/strutil.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/strutil.c b/src/strutil.c index 07ed7b44..b6c910f7 100644 --- a/src/strutil.c +++ b/src/strutil.c @@ -615,6 +615,7 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret) int32_t fractional_len = 0; int32_t exponent = 0; bool is_negative = false; + bool no_integer, no_fractional; while (isspace(*str)) str++; @@ -622,12 +623,16 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret) errno = 0; integral = g_ascii_strtoll(str, &endptr, 10); - if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') + if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') { endptr += 1; - else if (str == endptr && str[0] == '.') - /* EMPTY */; - else if (errno) + no_integer = true; + } else if (str == endptr && str[0] == '.') { + no_integer = true; + } else if (errno) { return SR_ERR; + } else { + no_integer = false; + } if (integral < 0 || str[0] == '-') is_negative = true; @@ -645,6 +650,9 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret) } if (errno) return SR_ERR; + no_fractional = endptr == start; + if (no_integer && no_fractional) + return SR_ERR; fractional_len = endptr - start; }