Untrack the connection before closing to avoid possible double-free

From Gangadharan S.A. Fixes issue #166.
This commit is contained in:
Daniele Varrazzo 2013-06-20 16:24:55 +01:00
parent 83c5d12cf1
commit 921b676471
2 changed files with 7 additions and 2 deletions

2
NEWS
View File

@ -5,6 +5,8 @@ What's new in psycopg 2.5.1
declared (:ticket:`#146`). declared (:ticket:`#146`).
- Fixed comparison of `Range` with non-range objects (:ticket:`#164`). - Fixed comparison of `Range` with non-range objects (:ticket:`#164`).
Thanks to Chris Withers for the patch. 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 What's new in psycopg 2.5

View File

@ -1128,10 +1128,13 @@ connection_dealloc(PyObject* obj)
{ {
connectionObject *self = (connectionObject *)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); PyObject_GC_UnTrack(self);
conn_close(self);
if (self->weakreflist) { if (self->weakreflist) {
PyObject_ClearWeakRefs(obj); PyObject_ClearWeakRefs(obj);
} }