diff options
author | Andrew Burgess <aburgess@redhat.com> | 2025-04-18 22:42:17 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2025-04-22 17:21:59 +0100 |
commit | 5d4187339f9f2f338d540adbdfd174aa9f1e92ab (patch) | |
tree | 1a0af6ebcf2de425cbea28755e3cfac5a4bb58a0 | |
parent | 93c145c2aaf3b85b7c3b7abee029da5438d6732f (diff) | |
download | binutils-5d4187339f9f2f338d540adbdfd174aa9f1e92ab.zip binutils-5d4187339f9f2f338d540adbdfd174aa9f1e92ab.tar.gz binutils-5d4187339f9f2f338d540adbdfd174aa9f1e92ab.tar.bz2 |
gdb/python: fix memory leak of gdb.Color objects
I noticed that this commit:
commit 6447969d0ac774b6dec0f95a0d3d27c27d158690
Date: Sat Oct 5 22:27:44 2024 +0300
Add an option with a color type.
has an unnecessary `Py_INCREF (self);` in gdb.Color.__init__. This
means that the reference count on all gdb.Color objects (that pass
through __init__) will be +1 from where they should normally be, and
this will stop the gdb.Color objects from being deallocated.
Fix by removing the Py_INCREF call.
Add a test which exposes the memory leak.
Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r-- | gdb/python/py-color.c | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-color-leak.exp | 28 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-color-leak.py | 31 |
3 files changed, 59 insertions, 1 deletions
diff --git a/gdb/python/py-color.c b/gdb/python/py-color.c index 91ad7ae..28f4142 100644 --- a/gdb/python/py-color.c +++ b/gdb/python/py-color.c @@ -256,7 +256,6 @@ colorpy_init (PyObject *self, PyObject *args, PyObject *kwds) return gdbpy_handle_gdb_exception (-1, except); } - Py_INCREF (self); return 0; } diff --git a/gdb/testsuite/gdb.python/py-color-leak.exp b/gdb/testsuite/gdb.python/py-color-leak.exp new file mode 100644 index 0000000..6d7fa7c --- /dev/null +++ b/gdb/testsuite/gdb.python/py-color-leak.exp @@ -0,0 +1,28 @@ +# Copyright (C) 2025 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This file is part of the GDB testsuite. It checks for memory leaks +# associated with allocating gdb.Color objects. + +load_lib gdb-python.exp + +require allow_python_tests + +standard_testfile + +clean_restart + +gdb_py_run_memory_leak_test ${srcdir}/${subdir}/${testfile}.py \ + "gdb.Color object deallocates correctly" diff --git a/gdb/testsuite/gdb.python/py-color-leak.py b/gdb/testsuite/gdb.python/py-color-leak.py new file mode 100644 index 0000000..50dc315 --- /dev/null +++ b/gdb/testsuite/gdb.python/py-color-leak.py @@ -0,0 +1,31 @@ +# Copyright (C) 2025 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import gdb_leak_detector + + +class color_leak_detector(gdb_leak_detector.gdb_leak_detector): + def __init__(self): + super().__init__(__file__) + self.color = None + + def allocate(self): + self.color = gdb.Color("red") + + def deallocate(self): + self.color = None + + +color_leak_detector().run() |