diff --git a/ChangeLog b/ChangeLog index 26b1ae958..449997fe2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-11-19 Saso Kiselkov + + Releasing a GSTLSHandle (created from +[NSFileHandle sslClass]) after + the TLS handshake will result in a segfault. Fix it. + 2013-11-18 Wolfgang Lux * Headers/GNUstepBase/NSCalendarDate+GNUstepBase.m: diff --git a/Source/NSFileHandle.m b/Source/NSFileHandle.m index 29d950577..b4c583440 100644 --- a/Source/NSFileHandle.m +++ b/Source/NSFileHandle.m @@ -959,8 +959,14 @@ GSTLSHandlePush(gnutls_transport_ptr_t handle, const void *buffer, size_t len) - (void) dealloc { - DESTROY(opts); - DESTROY(session); + // TLS may need to read data during teardown, and we need to wait for it. + [self setNonBlocking: NO]; + // Don't DESTROY ivars below. First release them, then set nil, because + // `session' may need this back-reference during TLS teardown. + TEST_RELEASE(opts); + TEST_RELEASE(session); + opts = nil; + session = nil; [super dealloc]; }