Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2561,6 +2561,11 @@ def test_incorrect_constructor(self):
args = ("bad.py", 1, 2, "abcdefg", 1)
self.assertRaises(TypeError, SyntaxError, "bad bad", args)

def test_syntax_error_memory_leak(self):
# gh-146250: memory leak with re-initialization of SyntaxError
e = SyntaxError("msg", ("file.py", 1, 2, "txt", 2, 3))
e.__init__("new_msg", ("new_file.py", 2, 3, "new_txt", 3, 4))


class TestInvalidExceptionMatcher(unittest.TestCase):
def test_except_star_invalid_exception_type(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed a memory leak in :exc:`SyntaxError` when re-initializing it.
26 changes: 14 additions & 12 deletions Objects/exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -2802,23 +2802,25 @@ SyntaxError_init(PyObject *op, PyObject *args, PyObject *kwds)
return -1;
}

self->end_lineno = NULL;
self->end_offset = NULL;
PyObject *filename, *lineno, *offset, *text;
PyObject *end_lineno = NULL;
PyObject *end_offset = NULL;
PyObject *metadata = NULL;
if (!PyArg_ParseTuple(info, "OOOO|OOO",
&self->filename, &self->lineno,
&self->offset, &self->text,
&self->end_lineno, &self->end_offset, &self->metadata)) {
&filename, &lineno,
&offset, &text,
&end_lineno, &end_offset, &metadata)) {
Py_DECREF(info);
return -1;
}

Py_INCREF(self->filename);
Py_INCREF(self->lineno);
Py_INCREF(self->offset);
Py_INCREF(self->text);
Py_XINCREF(self->end_lineno);
Py_XINCREF(self->end_offset);
Py_XINCREF(self->metadata);
Py_XSETREF(self->filename, Py_NewRef(filename));
Py_XSETREF(self->lineno, Py_NewRef(lineno));
Py_XSETREF(self->offset, Py_NewRef(offset));
Py_XSETREF(self->text, Py_NewRef(text));
Py_XSETREF(self->end_lineno, Py_XNewRef(end_lineno));
Py_XSETREF(self->end_offset, Py_XNewRef(end_offset));
Py_XSETREF(self->metadata, Py_XNewRef(metadata));
Py_DECREF(info);

if (self->end_lineno != NULL && self->end_offset == NULL) {
Expand Down
Loading