]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-143196: Fix crash in non-standard use of internal JSON encoder object ...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 12 Jan 2026 18:50:40 +0000 (19:50 +0100)
committerGitHub <noreply@github.com>
Mon, 12 Jan 2026 18:50:40 +0000 (18:50 +0000)
The internal encoder object returned by undocumented function
json.encoder.c_make_encoder() (aka _json.make_encoder()) crashed
when it was called with non-zero second argument.
(cherry picked from commit c559135c931789ebc752ae68814858c398cb798b)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_json/test_speedups.py
Misc/NEWS.d/next/Library/2026-01-09-17-50-26.gh-issue-143196.WxKxzU.rst [new file with mode: 0644]
Modules/_json.c

index 682014cfd5b344e8524521d4ddd23dff7d8727be..4c0aa5f993b30fd4c29daf3052d7cf6914fdc31f 100644 (file)
@@ -80,3 +80,34 @@ class TestEncode(CTest):
     def test_unsortable_keys(self):
         with self.assertRaises(TypeError):
             self.json.encoder.JSONEncoder(sort_keys=True).encode({'a': 1, 1: 'a'})
+
+    def test_current_indent_level(self):
+        enc = self.json.encoder.c_make_encoder(
+            markers=None,
+            default=str,
+            encoder=self.json.encoder.c_encode_basestring,
+            indent='\t',
+            key_separator=': ',
+            item_separator=', ',
+            sort_keys=False,
+            skipkeys=False,
+            allow_nan=False)
+        expected = (
+            '[\n'
+            '\t"spam", \n'
+            '\t{\n'
+            '\t\t"ham": "eggs"\n'
+            '\t}\n'
+            ']')
+        self.assertEqual(enc(['spam', {'ham': 'eggs'}], 0)[0], expected)
+        self.assertEqual(enc(['spam', {'ham': 'eggs'}], -3)[0], expected)
+        expected2 = (
+            '[\n'
+            '\t\t\t\t"spam", \n'
+            '\t\t\t\t{\n'
+            '\t\t\t\t\t"ham": "eggs"\n'
+            '\t\t\t\t}\n'
+            '\t\t\t]')
+        self.assertEqual(enc(['spam', {'ham': 'eggs'}], 3)[0], expected2)
+        self.assertRaises(TypeError, enc, ['spam', {'ham': 'eggs'}], 3.0)
+        self.assertRaises(TypeError, enc, ['spam', {'ham': 'eggs'}])
diff --git a/Misc/NEWS.d/next/Library/2026-01-09-17-50-26.gh-issue-143196.WxKxzU.rst b/Misc/NEWS.d/next/Library/2026-01-09-17-50-26.gh-issue-143196.WxKxzU.rst
new file mode 100644 (file)
index 0000000..9143cf2
--- /dev/null
@@ -0,0 +1,3 @@
+Fix crash when the internal encoder object returned by undocumented function
+:func:`!json.encoder.c_make_encoder` was called with non-zero second
+(*_current_indent_level*) argument.
index b3959cfe4a11b33f0c2e01e9aa0bd055645e54b7..39ec9a969cf04d477a45fe4f17030c81fd6be77c 100644 (file)
@@ -1383,6 +1383,7 @@ encoder_call(PyObject *op, PyObject *args, PyObject *kwds)
             return NULL;
         }
     }
+    indent_level = 0;
     if (encoder_listencode_obj(self, writer, obj, indent_level, indent_cache)) {
         PyUnicodeWriter_Discard(writer);
         Py_XDECREF(indent_cache);