From 110f2ebc035cd8c4c1440c50fa3958668a26a540 Mon Sep 17 00:00:00 2001 From: Eric Peden Date: Thu, 29 May 2014 20:00:14 -0700 Subject: [PATCH 1/2] Fix a memory leak in yajl.dump(). --- yajl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/yajl.c b/yajl.c index 9fb0d54..3bb7c24 100644 --- a/yajl.c +++ b/yajl.c @@ -339,6 +339,7 @@ static PyObject *_internal_stream_dump(PyObject *object, PyObject *stream, unsig buffer = _internal_encode((_YajlEncoder *)encoder, object, config); PyObject_CallMethodObjArgs(stream, __write, buffer, NULL); Py_XDECREF(encoder); + Py_XDECREF(buffer); return Py_True; bad_type: From a652ad05f7c5b1c1cac4c9b7d27f6ab577203787 Mon Sep 17 00:00:00 2001 From: Eric Peden Date: Thu, 29 May 2014 20:00:36 -0700 Subject: [PATCH 2/2] Fix memory leaks in ProcessObject. --- encoder.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/encoder.c b/encoder.c index a194a09..082dcfe 100644 --- a/encoder.c +++ b/encoder.c @@ -142,7 +142,9 @@ static yajl_gen_status ProcessObject(_YajlEncoder *self, PyObject *object) } } buffer[offset] = '\0'; - return yajl_gen_raw_string(handle, (const unsigned char *)(buffer), (unsigned int)(offset)); + status = yajl_gen_raw_string(handle, (const unsigned char *)(buffer), (unsigned int)(offset)); + free(buffer); + return status; } #ifdef IS_PYTHON3 if (PyBytes_Check(object)) { @@ -238,6 +240,9 @@ static yajl_gen_status ProcessObject(_YajlEncoder *self, PyObject *object) } status = ProcessObject(self, newKey); + if (key != newKey) { + Py_XDECREF(newKey); + } if (status == yajl_gen_in_error_state) return status; if (status == yajl_max_depth_exceeded) goto exit;