Skip to content

Commit d8e398a

Browse files
committed
Ensure buffer release before return
After reading data into a buffer the reading_generator_next function calls invokes the underlying yajl parsing routine, which might return successfully or not. There was a memory leak in the latter case, since the "view" Py_buffer object was not being released before checking for NULL returns and returning NULL ourselves. This commit fixes the bug by ensuring we release the "view" object before any returns, ensuring memory isn't leaked. This was originally reported in #97. Signed-off-by: Rodrigo Tobar <[email protected]>
1 parent 92a851e commit d8e398a

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
## Development
44

55
* Added support for Python 3.12.
6+
* Fixed a memory leak in the ``yajl2_c`` backend
7+
triggered only when the underlying ``yajl`` functions
8+
reported a failure (#97).
69

710
## [3.2.0.post0]
811

ijson/backends/yajl2_c/reading_generator.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ PyObject *reading_generator_next(reading_generator_t *self)
7474
length = view.len;
7575
PyObject *send_res = ijson_yajl_parse(basic_parse_basecoro->h, view.buf, view.len);
7676
Py_DECREF(pbuffer);
77+
PyBuffer_Release(&view);
7778
N_N(send_res);
7879
}
7980
else {
@@ -84,9 +85,10 @@ PyObject *reading_generator_next(reading_generator_t *self)
8485
N_M1(length);
8586
Py_DECREF(plength);
8687
N_M1(PyObject_GetBuffer(self->buffer, &view, PyBUF_SIMPLE));
87-
N_N(ijson_yajl_parse(basic_parse_basecoro->h, view.buf, length));
88+
PyObject *send_res = ijson_yajl_parse(basic_parse_basecoro->h, view.buf, length);
89+
PyBuffer_Release(&view);
90+
N_N(send_res);
8891
}
89-
PyBuffer_Release(&view);
9092
nevents = PyList_Size(events);
9193

9294
if (length == 0) {

0 commit comments

Comments
 (0)