]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-104510: Fix refleaks in `_io` base types (#104516)
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Tue, 16 May 2023 14:38:17 +0000 (20:08 +0530)
committerGitHub <noreply@github.com>
Tue, 16 May 2023 14:38:17 +0000 (20:08 +0530)
Modules/_io/bufferedio.c
Modules/_io/iobase.c
Modules/_io/textio.c

index 7a0c516411c73b6bf59257224393ed078d5f4d99..f30d54a5e11b0a94bca4d3f9f42d1cf844e47d6d 100644 (file)
@@ -2424,13 +2424,6 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw,
 #include "clinic/bufferedio.c.h"
 #undef clinic_state
 
-static int
-bufferediobase_traverse(PyObject *self, visitproc visit, void *arg)
-{
-    Py_VISIT(Py_TYPE(self));
-    return 0;
-}
-
 static PyMethodDef bufferediobase_methods[] = {
     _IO__BUFFEREDIOBASE_DETACH_METHODDEF
     _IO__BUFFEREDIOBASE_READ_METHODDEF
@@ -2444,13 +2437,13 @@ static PyMethodDef bufferediobase_methods[] = {
 static PyType_Slot bufferediobase_slots[] = {
     {Py_tp_doc, (void *)bufferediobase_doc},
     {Py_tp_methods, bufferediobase_methods},
-    {Py_tp_traverse, bufferediobase_traverse},
     {0, NULL},
 };
 
+/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */
 PyType_Spec bufferediobase_spec = {
     .name = "_io._BufferedIOBase",
-    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
               Py_TPFLAGS_IMMUTABLETYPE),
     .slots = bufferediobase_slots,
 };
index 14d48813aefe8313c4b66a4ae286d64a5afe7dc3..bcb498d9c5b5de1c40da3d0b4a1e5bbff7a20579 100644 (file)
@@ -1036,13 +1036,6 @@ rawiobase_write(PyObject *self, PyObject *args)
     return NULL;
 }
 
-static int
-rawiobase_traverse(PyObject *self, visitproc visit, void *arg)
-{
-    Py_VISIT(Py_TYPE(self));
-    return 0;
-}
-
 static PyMethodDef rawiobase_methods[] = {
     _IO__RAWIOBASE_READ_METHODDEF
     _IO__RAWIOBASE_READALL_METHODDEF
@@ -1054,13 +1047,13 @@ static PyMethodDef rawiobase_methods[] = {
 static PyType_Slot rawiobase_slots[] = {
     {Py_tp_doc, (void *)rawiobase_doc},
     {Py_tp_methods, rawiobase_methods},
-    {Py_tp_traverse, rawiobase_traverse},
     {0, NULL},
 };
 
+/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */
 PyType_Spec rawiobase_spec = {
     .name = "_io._RawIOBase",
-    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
               Py_TPFLAGS_IMMUTABLETYPE),
     .slots = rawiobase_slots,
 };
index e858a1fb498f82fc4cccbdfec16ed7e5a4609e4c..46411c70a96753690010af1e16ee569e36abf821 100644 (file)
@@ -167,12 +167,6 @@ textiobase_errors_get(PyObject *self, void *context)
     Py_RETURN_NONE;
 }
 
-static int
-textiobase_traverse(PyObject *self, visitproc visit, void *arg)
-{
-    Py_VISIT(Py_TYPE(self));
-    return 0;
-}
 
 static PyMethodDef textiobase_methods[] = {
     _IO__TEXTIOBASE_DETACH_METHODDEF
@@ -193,13 +187,13 @@ static PyType_Slot textiobase_slots[] = {
     {Py_tp_doc, (void *)textiobase_doc},
     {Py_tp_methods, textiobase_methods},
     {Py_tp_getset, textiobase_getset},
-    {Py_tp_traverse, textiobase_traverse},
     {0, NULL},
 };
 
+/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */
 PyType_Spec textiobase_spec = {
     .name = "_io._TextIOBase",
-    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
               Py_TPFLAGS_IMMUTABLETYPE),
     .slots = textiobase_slots,
 };