From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: [PATCH 2/2] JSON serialization: reject duplicate keys in hashtables Date: Tue, 19 Dec 2017 00:17:30 +0100 Message-ID: <20171218231730.38840-2-phst@google.com> References: <20171218231730.38840-1-phst@google.com> NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1513639030 14559 195.159.176.226 (18 Dec 2017 23:17:10 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 18 Dec 2017 23:17:10 +0000 (UTC) Cc: Philipp Stephani To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Dec 19 00:17:06 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eR4ee-0003YR-Br for ged-emacs-devel@m.gmane.org; Tue, 19 Dec 2017 00:17:04 +0100 Original-Received: from localhost ([::1]:52745 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eR4gc-0003xX-Jr for ged-emacs-devel@m.gmane.org; Mon, 18 Dec 2017 18:19:06 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38053) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eR4fQ-0003vx-S3 for emacs-devel@gnu.org; Mon, 18 Dec 2017 18:17:55 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eR4fP-00073X-PS for emacs-devel@gnu.org; Mon, 18 Dec 2017 18:17:52 -0500 Original-Received: from mail-wr0-x22e.google.com ([2a00:1450:400c:c0c::22e]:36598) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eR4fP-00072q-Ia for emacs-devel@gnu.org; Mon, 18 Dec 2017 18:17:51 -0500 Original-Received: by mail-wr0-x22e.google.com with SMTP id u19so9652705wrc.3 for ; Mon, 18 Dec 2017 15:17:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iLTedBRE4yqWM7vr8/NID1PTyqGxDpmcxESTukrkAN8=; b=UhTfCTm7d54RFvZwEukohN7Yh6hLGuMqqBAjNrynj/hNPqWoiRlIlD73oX0L7BILFk wC0hxA/xlroXZ5XNM9s5Kbe8P3KJRw3fl4guX0ht8HjNrHnyaVraD7fZ9jroB8bKYerk EmneV+qcvHoK+WCouCtSnWKpD02Xi1G1BvRep1tqGdMgUmHBuOSdk/Z8fETLNGxUrqFa 43UfEFYm4KmEoqpwALcXPXMOA+Pmodla7YNxFpjRE+aMdhuRblbwCv/sTDpGlVS3LZtY i2O7+vHb4fedDEYJOIcBoADHXC12Wxvs2iZraA5AjsprLJydlu4XTNrYfx2sZjILK7b2 5HWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iLTedBRE4yqWM7vr8/NID1PTyqGxDpmcxESTukrkAN8=; b=BvZO7UlEC+koQ0XLpIc7aI0wlMWg8ltIJOvIOaDQCXQAOq2EDpZw4bPYBAtSyw8k2P GUIws265UqRfG/yUd2P6c2F+Ek9sK+khMYrnaeLDr9lMYdvMgeg4H9hpTdemKEKZK0Xs 3cDVe0pFp/jYJWxH5ucPmgU9HcWpx7nHA8+HK0xefy6CPyCaxqkxev1+mUDesn3R/NtO Ps2kaNgExi131vj0rUWO+c4GsKplR6m1FWmI8PDgP8xKRysFartavyzplU3z25Ydr1U4 rk2jFgEsLus1ZRFaWPLQIOlgvWYxZkyQ8BDuZL2+TwM07RH+3NwKhic1R9ngBHK3GaNQ 1mig== X-Gm-Message-State: AKGB3mKmsK6dXYPuiknkIBX/s7ZUOsRZmeTKWroufX6ah5YUcIJ9ZkZD aXiz9gw8mTntNcsvXmfhJc2Dpxld X-Google-Smtp-Source: ACJfBouOkT4F0sl4oNMEX7tOMGpcpLzRsv/lUE8e4Exd2KGPynWwpkMHAzJ/pM1rhYmxLae84+9ppQ== X-Received: by 10.223.182.152 with SMTP id j24mr1928498wre.242.1513639070323; Mon, 18 Dec 2017 15:17:50 -0800 (PST) Original-Received: from p.fritz.box (p5B13F7C7.dip0.t-ipconnect.de. [91.19.247.199]) by smtp.gmail.com with ESMTPSA id l142sm400763wmb.43.2017.12.18.15.17.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 18 Dec 2017 15:17:49 -0800 (PST) X-Google-Original-From: Philipp Stephani X-Mailer: git-send-email 2.15.1 In-Reply-To: <20171218231730.38840-1-phst@google.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::22e X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:221235 Archived-At: * 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