diff options
author | Jo-Philipp Wich <jo@mein.io> | 2024-10-16 12:09:31 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2024-10-16 12:09:31 +0200 |
commit | 4134e7182624b37bf17d91fc89b500f5cb443187 (patch) | |
tree | 5a4878d66d02b9f832e34096574083e409fd2858 | |
parent | 9cf53dda36bc25b513ec1b1cdfc851a10b37473f (diff) |
vallist: more thoroughly check for trailing garbage after numeric string
When converting numeric strings into numbers, ensure that only optional
trailing whitespace follows and no other characters.
Fixes: #231
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | tests/custom/99_bugs/49_trailing_garbage_string_as_number | 23 | ||||
-rw-r--r-- | vallist.c | 10 |
2 files changed, 31 insertions, 2 deletions
diff --git a/tests/custom/99_bugs/49_trailing_garbage_string_as_number b/tests/custom/99_bugs/49_trailing_garbage_string_as_number new file mode 100644 index 0000000..1b48146 --- /dev/null +++ b/tests/custom/99_bugs/49_trailing_garbage_string_as_number @@ -0,0 +1,23 @@ +Ensure that numeric strings followed by non-whitespace are treated as NaN. + +-- Testcase -- +{% +printf("%.J\n", [ + "1" == 1, + " 1" == 1, + "1 " == 1, + "1a" == 1, + "1 a" == 1 +]); +%} +-- End -- + +-- Expect stdout -- +[ + true, + true, + true, + false, + false +] +-- End -- @@ -106,7 +106,10 @@ uc_number_parse_common(const char *buf, bool octal, char **end) if (base >= 10 && (**end == '.' || (**end|32) == 'e')) { d = strtod(p, end); - if (!isspace(**end) && **end != 0) + while (isspace(**end)) + (*end)++; + + if (**end != 0) return NULL; if (neg) @@ -115,7 +118,10 @@ uc_number_parse_common(const char *buf, bool octal, char **end) return ucv_double_new(d); } - if (!isspace(**end) && **end != 0) + while (isspace(**end)) + (*end)++; + + if (**end != 0) return NULL; if (neg) { |