summaryrefslogtreecommitdiffstats
path: root/Modules/_json.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-01-03 09:19:48 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-01-03 09:19:48 (GMT)
commit8d979d576e123c03f0bb92aeb8043b8d7aa57cf7 (patch)
tree18f963bb28027421525300a59494b3c06218c458 /Modules/_json.c
parentc70225c98cc449de4dce99a93532498ae44ba7de (diff)
parent21fe7213455748fa321333d67e3542848bec9630 (diff)
downloadcpython-8d979d576e123c03f0bb92aeb8043b8d7aa57cf7.zip
cpython-8d979d576e123c03f0bb92aeb8043b8d7aa57cf7.tar.gz
cpython-8d979d576e123c03f0bb92aeb8043b8d7aa57cf7.tar.bz2
Fixed possible reference leaks in the _json module.
Diffstat (limited to 'Modules/_json.c')
-rw-r--r--Modules/_json.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/Modules/_json.c b/Modules/_json.c
index d3dbf98..5b3d803 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -845,14 +845,16 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
int kind;
Py_ssize_t end_idx;
PyObject *val = NULL;
- PyObject *rval = PyList_New(0);
+ PyObject *rval;
Py_ssize_t next_idx;
- if (rval == NULL)
- return NULL;
if (PyUnicode_READY(pystr) == -1)
return NULL;
+ rval = PyList_New(0);
+ if (rval == NULL)
+ return NULL;
+
str = PyUnicode_DATA(pystr);
kind = PyUnicode_KIND(pystr);
end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
@@ -1559,8 +1561,11 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc,
return -1;
}
- if (Py_EnterRecursiveCall(" while encoding a JSON object"))
+ if (Py_EnterRecursiveCall(" while encoding a JSON object")) {
+ Py_DECREF(newobj);
+ Py_XDECREF(ident);
return -1;
+ }
rv = encoder_listencode_obj(s, acc, newobj, indent_level);
Py_LeaveRecursiveCall();