diff options
| author | Philipp Stephani | 2020-06-29 12:32:56 +0200 |
|---|---|---|
| committer | Philipp Stephani | 2020-06-29 12:32:56 +0200 |
| commit | 59e768d64ad97782249fda9e53b6adc94c6d0130 (patch) | |
| tree | 3221ba10b639751b10a067c1fab8017830ab46f2 /src | |
| parent | cce00bef0313bc42beee8096d9312313889dc92d (diff) | |
| download | emacs-59e768d64ad97782249fda9e53b6adc94c6d0130.tar.gz emacs-59e768d64ad97782249fda9e53b6adc94c6d0130.zip | |
Fix undefined behavior in json.c (Bug#42113)
* src/json.c (lisp_to_json_toplevel_1, Fjson_parse_string): Check
whether input strings are actually strings.
* test/src/json-tests.el (json-parse-string/wrong-type)
(json-serialize/wrong-hash-key-type): New regression tests.
Diffstat (limited to 'src')
| -rw-r--r-- | src/json.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/json.c b/src/json.c index 2e50ce514fd..4648cb4c3b7 100644 --- a/src/json.c +++ b/src/json.c | |||
| @@ -365,6 +365,7 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp, | |||
| 365 | Lisp_Object key = HASH_KEY (h, i); | 365 | Lisp_Object key = HASH_KEY (h, i); |
| 366 | if (!EQ (key, Qunbound)) | 366 | if (!EQ (key, Qunbound)) |
| 367 | { | 367 | { |
| 368 | CHECK_STRING (key); | ||
| 368 | Lisp_Object ekey = json_encode (key); | 369 | Lisp_Object ekey = json_encode (key); |
| 369 | /* We can't specify the length, so the string must be | 370 | /* We can't specify the length, so the string must be |
| 370 | NUL-terminated. */ | 371 | NUL-terminated. */ |
| @@ -975,6 +976,7 @@ usage: (json-parse-string STRING &rest ARGS) */) | |||
| 975 | #endif | 976 | #endif |
| 976 | 977 | ||
| 977 | Lisp_Object string = args[0]; | 978 | Lisp_Object string = args[0]; |
| 979 | CHECK_STRING (string); | ||
| 978 | Lisp_Object encoded = json_encode (string); | 980 | Lisp_Object encoded = json_encode (string); |
| 979 | check_string_without_embedded_nuls (encoded); | 981 | check_string_without_embedded_nuls (encoded); |
| 980 | struct json_configuration conf = | 982 | struct json_configuration conf = |