]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/python: fix memory leak of gdb.Color objects
authorAndrew Burgess <aburgess@redhat.com>
Fri, 18 Apr 2025 21:42:17 +0000 (22:42 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Tue, 22 Apr 2025 16:21:59 +0000 (17:21 +0100)
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>
gdb/python/py-color.c
gdb/testsuite/gdb.python/py-color-leak.exp [new file with mode: 0644]
gdb/testsuite/gdb.python/py-color-leak.py [new file with mode: 0644]

index 91ad7ae7bc9983192b87aa634404f9664bd08251..28f4142dd4752bdf6516d71a4e2e0ae0f1b0a108 100644 (file)
@@ -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 (file)
index 0000000..6d7fa7c
--- /dev/null
@@ -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 (file)
index 0000000..50dc315
--- /dev/null
@@ -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()