Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
6 changes: 6 additions & 0 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1954,6 +1954,12 @@ def test_exec_set_nomemory_hang(self):
self.assertGreater(len(output), 0) # At minimum, should not hang
self.assertIn(b"MemoryError", output)

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


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

self->end_lineno = NULL;
self->end_offset = NULL;
Py_XDECREF(self->filename);
Py_XDECREF(self->lineno);
Py_XDECREF(self->offset);
Py_XDECREF(self->text);
Py_XSETREF(self->end_lineno, NULL);
Py_XSETREF(self->end_offset, NULL);
Py_XDECREF(self->metadata);

if (!PyArg_ParseTuple(info, "OOOO|OOO",
&self->filename, &self->lineno,
&self->offset, &self->text,
Expand Down
Loading