From 2b2aaa7bba77b4615e58a3b2b25dab404064e366 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Mon, 16 Nov 2015 04:42:42 +0000 Subject: Fix #1898: If transport is being shutdown/destroyed and connected event comes, proceed as error/cancelled connect. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5200 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_transport_tcp.c | 12 ++++++++++-- pjsip/src/pjsip/sip_transport_tls.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c index d2e0a28b..222cb13f 100644 --- a/pjsip/src/pjsip/sip_transport_tcp.c +++ b/pjsip/src/pjsip/sip_transport_tcp.c @@ -1470,8 +1470,16 @@ static pj_bool_t on_connect_complete(pj_activesock_t *asock, /* Mark that pending connect() operation has completed. */ tcp->has_pending_connect = PJ_FALSE; - if (tcp->base.is_shutdown || tcp->base.is_destroying) - return PJ_FALSE; + /* If transport is being shutdown/destroyed, proceed as error connect. + * Note that it is important to notify application via on_data_sent() + * as otherwise the transport reference counter may never reach zero + * (see #1898). + */ + if ((tcp->base.is_shutdown || tcp->base.is_destroying) && + status == PJ_SUCCESS) + { + status = PJ_ECANCELLED; + } /* Check connect() status */ if (status != PJ_SUCCESS) { diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c index ac7ac930..5e63a2c8 100644 --- a/pjsip/src/pjsip/sip_transport_tls.c +++ b/pjsip/src/pjsip/sip_transport_tls.c @@ -1566,8 +1566,16 @@ static pj_bool_t on_connect_complete(pj_ssl_sock_t *ssock, tls = (struct tls_transport*) pj_ssl_sock_get_user_data(ssock); - if (tls->base.is_shutdown || tls->base.is_destroying) - return PJ_FALSE; + /* If transport is being shutdown/destroyed, proceed as error connect. + * Note that it is important to notify application via on_data_sent() + * as otherwise the transport reference counter may never reach zero + * (see #1898). + */ + if ((tls->base.is_shutdown || tls->base.is_destroying) && + status == PJ_SUCCESS) + { + status = PJ_ECANCELLED; + } /* Check connect() status */ if (status != PJ_SUCCESS) { -- cgit v1.2.3