From e46a196f3be2820b514ed3ddfe1741be91be3d26 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 1 Feb 2007 03:37:11 +0000 Subject: Fixed ticket #84: pjsua_transport_close() doesn't properly close transport (especially TLS) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@923 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsua-lib/pjsua_core.c | 42 ++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'pjsip/src/pjsua-lib/pjsua_core.c') diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 79b39283..26612c3c 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -1284,6 +1284,8 @@ PJ_DEF(pj_status_t) pjsua_transport_set_enable( pjsua_transport_id id, PJ_DEF(pj_status_t) pjsua_transport_close( pjsua_transport_id id, pj_bool_t force ) { + pj_status_t status; + /* Make sure id is in range. */ PJ_ASSERT_RETURN(id>=0 && iddestroy) + (pjsua_var.tpdata[id].data.factory); + if (status != PJ_SUCCESS) + return status; + break; + default: - break; + return PJ_EINVAL; } } else { + /* If force is not specified, transports will be closed at their + * convenient time. However this will leak PJSUA-API transport + * descriptors as PJSUA-API wouldn't know when exactly the + * transport is closed thus it can't cleanup PJSUA transport + * descriptor. + */ switch (pjsua_var.tpdata[id].type) { case PJSIP_TRANSPORT_UDP: return pjsip_transport_shutdown(pjsua_var.tpdata[id].data.tp); + case PJSIP_TRANSPORT_TLS: case PJSIP_TRANSPORT_TCP: return (*pjsua_var.tpdata[id].data.factory->destroy) (pjsua_var.tpdata[id].data.factory); default: - break; + return PJ_EINVAL; } } - /* Unreachable */ - pj_assert(!"Unknown transport"); - return PJ_EINVALIDOP; + /* Cleanup pjsua data when force is applied */ + if (force) { + pjsua_var.tpdata[id].type = PJSIP_TRANSPORT_UNSPECIFIED; + pjsua_var.tpdata[id].data.ptr = NULL; + } + + return PJ_SUCCESS; } -- cgit v1.2.3