]> granicus.if.org Git - python/commitdiff
[3.6] bpo-30936: Fix a reference leak in json when fail to sort keys. (GH-2712)....
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 16 Jul 2017 04:48:08 +0000 (07:48 +0300)
committerGitHub <noreply@github.com>
Sun, 16 Jul 2017 04:48:08 +0000 (07:48 +0300)
(cherry picked from commit 49f6449ef4b81537c19b82329caaf60596c516c2)

Lib/test/test_json/test_speedups.py
Modules/_json.c

index 8d98ab5ae1c39862d6b67cfce1a3950b57d31efa..56f1882001d666807998f3ebb973b40b8fb3b5ca 100644 (file)
@@ -44,3 +44,7 @@ class TestEncode(CTest):
         self.assertRaises(ZeroDivisionError, test, 'check_circular')
         self.assertRaises(ZeroDivisionError, test, 'allow_nan')
         self.assertRaises(ZeroDivisionError, test, 'sort_keys')
+
+    def test_unsortable_keys(self):
+        with self.assertRaises(TypeError):
+            self.json.encoder.JSONEncoder(sort_keys=True).encode({'a': 1, 1: 'a'})
index a84b08510907792aebb91dcfed56389305f0c139..1be4c17cf953691bc74604d32d12f1be9c3ba722 100644 (file)
@@ -1601,8 +1601,10 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc,
     if (items == NULL)
         goto bail;
     sortkeys = PyObject_IsTrue(s->sort_keys);
-    if (sortkeys < 0 || (sortkeys && PyList_Sort(items) < 0))
+    if (sortkeys < 0 || (sortkeys && PyList_Sort(items) < 0)) {
+        Py_DECREF(items);
         goto bail;
+    }
     it = PyObject_GetIter(items);
     Py_DECREF(items);
     if (it == NULL)