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