Skip to content

Commit 45c471c

Browse files
[3.5] bpo-30936: Fix a reference leak in json when fail to sort keys. (GH-2712). (#2728)
(cherry picked from commit 49f6449)
1 parent ada3f31 commit 45c471c

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

Lib/test/test_json/test_speedups.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,7 @@ def test(name):
4444
self.assertRaises(ZeroDivisionError, test, 'check_circular')
4545
self.assertRaises(ZeroDivisionError, test, 'allow_nan')
4646
self.assertRaises(ZeroDivisionError, test, 'sort_keys')
47+
48+
def test_unsortable_keys(self):
49+
with self.assertRaises(TypeError):
50+
self.json.encoder.JSONEncoder(sort_keys=True).encode({'a': 1, 1: 'a'})

Modules/_json.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1601,8 +1601,10 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc,
16011601
if (items == NULL)
16021602
goto bail;
16031603
sortkeys = PyObject_IsTrue(s->sort_keys);
1604-
if (sortkeys < 0 || (sortkeys && PyList_Sort(items) < 0))
1604+
if (sortkeys < 0 || (sortkeys && PyList_Sort(items) < 0)) {
1605+
Py_DECREF(items);
16051606
goto bail;
1607+
}
16061608
it = PyObject_GetIter(items);
16071609
Py_DECREF(items);
16081610
if (it == NULL)

0 commit comments

Comments
 (0)