Christian Heimes added the comment:
New patch
The new patch doesn't cause a seg fault but it doesn't help. It
*increases* the number of reference leaks.
test_ssl leaked [1610, 1610] references, sum=3220
Added file: http://bugs.python.org/file8885/ssl_gc.patch
__________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1469>
__________________________________
Index: Tools/scripts/combinerefs.py
===================================================================
--- Tools/scripts/combinerefs.py (Revision 59376)
+++ Tools/scripts/combinerefs.py (Arbeitskopie)
@@ -86,7 +86,8 @@
break
def combine(fname):
- f = file(fname)
+ f = open(fname)
+
fi = iter(f)
for line in read(fi, re.compile(r'^Remaining objects:$'), False):
Index: Modules/_ssl.c
===================================================================
--- Modules/_ssl.c (Revision 59376)
+++ Modules/_ssl.c (Arbeitskopie)
@@ -266,7 +266,7 @@
int ret;
int verification_mode;
- self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
+ self = PyObject_GC_New(PySSLObject, &PySSL_Type); /* Create new object */
if (self == NULL)
return NULL;
self->peer_cert = NULL;
@@ -385,6 +385,7 @@
self->Socket = Sock;
Py_INCREF(self->Socket);
+ _PyObject_GC_TRACK(self);
return self;
fail:
if (errstr)
@@ -1050,16 +1051,33 @@
return NULL;
}
-static void PySSL_dealloc(PySSLObject *self)
+/* GC support. */
+static int
+PySSL_traverse(PySSLObject *self, visitproc visit, void *arg)
{
+ Py_VISIT(self->Socket);
+ return 0;
+}
+
+static int
+PySSL_clear(PySSLObject *self)
+{
+ Py_CLEAR(self->Socket);
+ return 0;
+}
+
+static void
+PySSL_dealloc(PySSLObject *self)
+{
+ PyObject_GC_UnTrack(self);
if (self->peer_cert) /* Possible not to have one? */
- X509_free (self->peer_cert);
+ X509_free(self->peer_cert);
if (self->ssl)
SSL_free(self->ssl);
if (self->ctx)
SSL_CTX_free(self->ctx);
- Py_XDECREF(self->Socket);
- PyObject_Del(self);
+ PySSL_clear(self);
+ Py_Type(self)->tp_free((PyObject *)self);
}
/* If the socket has a timeout, do a select()/poll() on the socket.
@@ -1359,20 +1377,15 @@
{NULL, NULL}
};
-static PyObject *PySSL_getattr(PySSLObject *self, char *name)
-{
- return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
-}
-
static PyTypeObject PySSL_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "ssl.SSLContext", /*tp_name*/
+ "_ssl.SSLContext", /*tp_name*/
sizeof(PySSLObject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)PySSL_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)PySSL_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
@@ -1380,6 +1393,32 @@
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT |
+ Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)PySSL_traverse, /* tp_traverse */
+ (inquiry)PySSL_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PySSLMethods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+ PyObject_GC_Del, /* tp_free */
};
#ifdef HAVE_OPENSSL_RAND
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com