diff --git a/NEWS b/NEWS index e2f6b7fe..53b1ec28 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ What's new in psycopg 2.5.1 declared (:ticket:`#146`). - Fixed comparison of `Range` with non-range objects (:ticket:`#164`). Thanks to Chris Withers for the patch. +- Fixed double-free on connection dealloc (:ticket:`#166`). Thanks to + Gangadharan S.A. for the report and fix suggestion. What's new in psycopg 2.5 diff --git a/psycopg/connection_type.c b/psycopg/connection_type.c index e854fa51..b3d4aa63 100644 --- a/psycopg/connection_type.c +++ b/psycopg/connection_type.c @@ -1128,10 +1128,13 @@ connection_dealloc(PyObject* obj) { connectionObject *self = (connectionObject *)obj; - conn_close(self); - + /* Make sure to untrack the connection before calling conn_close, which may + * allow a different thread to try and dealloc the connection again, + * resulting in a double-free segfault (ticket #166). */ PyObject_GC_UnTrack(self); + conn_close(self); + if (self->weakreflist) { PyObject_ClearWeakRefs(obj); }