diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-04-22 11:40:13 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-04-22 11:43:28 -0700 |
commit | 4bf3c94939406de6610cc83476adaed789826623 (patch) | |
tree | 2870d7e865baebb00b89b791801c969683e56a36 /src/json.c | |
parent | 981470e3590534a4d2947dfe5626cae832c6502d (diff) | |
download | emacs-4bf3c94939406de6610cc83476adaed789826623.tar.gz emacs-4bf3c94939406de6610cc83476adaed789826623.tar.bz2 emacs-4bf3c94939406de6610cc83476adaed789826623.zip |
Go back to old way of checking json int range
Although the lisp.h macros really need improvement,
INTEGER_TO_INT is not the right way to go about it, as it
causes conversion from intmax_t to uintmax_t and back again,
which can cause a signal if the value is negative.
* src/lisp.h (INTEGER_TO_INT, ranged_integer_to_int)
(ranged_integer_to_uint): Remove, reverting recent changes to
this file.
* src/json.c (lisp_to_json): Revert to previous code,
as the change messes up with uintmax_t<->intmax_t conversion.
Diffstat (limited to 'src/json.c')
-rw-r--r-- | src/json.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/json.c b/src/json.c index 16500bce72d..256d485eead 100644 --- a/src/json.c +++ b/src/json.c @@ -495,7 +495,14 @@ lisp_to_json (Lisp_Object lisp, struct json_configuration *conf) else if (EQ (lisp, Qt)) return json_check (json_true ()); else if (INTEGERP (lisp)) - return json_check (json_integer (INTEGER_TO_INT (lisp, json_int_t))); + { + intmax_t low = TYPE_MINIMUM (json_int_t); + intmax_t high = TYPE_MAXIMUM (json_int_t); + intmax_t value; + if (! (integer_to_intmax (lisp, &value) && low <= value && value <= high)) + args_out_of_range_3 (lisp, make_int (low), make_int (high)); + return json_check (json_integer (value)); + } else if (FLOATP (lisp)) return json_check (json_real (XFLOAT_DATA (lisp))); else if (STRINGP (lisp)) |