Pushed to master as 3455192777459a08a38b0adb311a76202e29f48d. Philipp Stephani schrieb am Di., 19. Dez. 2017 um 00:17 Uhr: > * src/json.c (lisp_to_json_toplevel_1): Reject duplicate keys in > hashtables. > > * test/src/json-tests.el (json-serialize/object-with-duplicate-keys): > Add unit tests. > --- > src/json.c | 7 ++++++- > test/src/json-tests.el | 8 ++++++++ > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/src/json.c b/src/json.c > index b996cad5a6..3eba5c4310 100644 > --- a/src/json.c > +++ b/src/json.c > @@ -340,7 +340,12 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp, json_t > **json) > /* We can't specify the length, so the string must be > null-terminated. */ > check_string_without_embedded_nulls (key); > - int status = json_object_set_new (*json, SSDATA (key), > + const char *key_data = SSDATA (key); > + /* Reject duplicate keys. These are possible if the hash > + table test is not `equal'. */ > + if (json_object_get (*json, key_data) != NULL) > + wrong_type_argument (Qjson_value_p, lisp); > + int status = json_object_set_new (*json, key_data, > lisp_to_json (HASH_VALUE > (h, i))); > if (status == -1) > /* FIXME: A failure here might also indicate that the > diff --git a/test/src/json-tests.el b/test/src/json-tests.el > index 551f8ac5fe..4edf9d8df0 100644 > --- a/test/src/json-tests.el > +++ b/test/src/json-tests.el > @@ -52,6 +52,14 @@ > (should (equal (json-serialize table) > "{\"abc\":[1,2,true],\"def\":null}")))) > > +(ert-deftest json-serialize/object-with-duplicate-keys () > + (skip-unless (fboundp 'json-serialize)) > + (let ((table (make-hash-table :test #'eq))) > + (puthash (copy-sequence "abc") [1 2 t] table) > + (puthash (copy-sequence "abc") :null table) > + (should (equal (hash-table-count table) 2)) > + (should-error (json-serialize table) :type 'wrong-type-argument))) > + > (ert-deftest json-parse-string/object () > (skip-unless (fboundp 'json-parse-string)) > (let ((actual > -- > 2.15.1 > >