From 2853944b8b3887300705dfd09139b1ab32e0c86c Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Thu, 30 Jun 2016 08:23:08 +0000 Subject: Fixed #1929: Fixed memory leak when using sip_auth_client since it's also used by other components, such as sip_dialog, publishc, and pjsua_im. Application should use the new API pjsip_auth_clt_deinit() to release the pool. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5373 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsip/sip_auth.h | 10 ++++++++++ pjsip/src/pjsip-simple/publishc.c | 2 ++ pjsip/src/pjsip-ua/sip_reg.c | 8 +------- pjsip/src/pjsip/sip_auth_client.c | 21 +++++++++++++++++++-- pjsip/src/pjsip/sip_dialog.c | 1 + pjsip/src/pjsua-lib/pjsua_im.c | 4 ++++ 6 files changed, 37 insertions(+), 9 deletions(-) (limited to 'pjsip') diff --git a/pjsip/include/pjsip/sip_auth.h b/pjsip/include/pjsip/sip_auth.h index ba03f600..37cfd6b9 100644 --- a/pjsip/include/pjsip/sip_auth.h +++ b/pjsip/include/pjsip/sip_auth.h @@ -341,6 +341,16 @@ PJ_DECL(pj_status_t) pjsip_auth_clt_init( pjsip_auth_clt_sess *sess, unsigned options); +/** + * Deinitialize client authentication session data structure. + * + * @param sess The client authentication session. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjsip_auth_clt_deinit( pjsip_auth_clt_sess *sess); + + /** * Clone client initialization session. * diff --git a/pjsip/src/pjsip-simple/publishc.c b/pjsip/src/pjsip-simple/publishc.c index dd4e8cdb..2501d683 100644 --- a/pjsip/src/pjsip-simple/publishc.c +++ b/pjsip/src/pjsip-simple/publishc.c @@ -222,6 +222,8 @@ PJ_DEF(pj_status_t) pjsip_publishc_destroy(pjsip_publishc *pubc) if (pubc->mutex) pj_mutex_destroy(pubc->mutex); + + pjsip_auth_clt_deinit(&pubc->auth_sess); pjsip_endpt_release_pool(pubc->endpt, pubc->pool); } diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c index 2bc05a70..6b147610 100644 --- a/pjsip/src/pjsip-ua/sip_reg.c +++ b/pjsip/src/pjsip-ua/sip_reg.c @@ -176,7 +176,6 @@ PJ_DEF(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc) regc->cb = NULL; pj_lock_release(regc->lock); } else { - pjsip_cached_auth *auth = NULL; pjsip_tpselector_dec_ref(®c->tp_sel); if (regc->last_transport) { pjsip_transport_dec_ref(regc->last_transport); @@ -191,12 +190,7 @@ PJ_DEF(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc) pj_lock_destroy(regc->lock); regc->lock = NULL; - auth = regc->auth_sess.cached_auth.next; - while (auth != ®c->auth_sess.cached_auth) { - pjsip_endpt_release_pool(regc->endpt, auth->pool); - auth = auth->next; - } - + pjsip_auth_clt_deinit(®c->auth_sess); pjsip_endpt_release_pool(regc->endpt, regc->pool); } diff --git a/pjsip/src/pjsip/sip_auth_client.c b/pjsip/src/pjsip/sip_auth_client.c index 6a4c10a7..811d98c4 100644 --- a/pjsip/src/pjsip/sip_auth_client.c +++ b/pjsip/src/pjsip/sip_auth_client.c @@ -499,6 +499,23 @@ PJ_DEF(pj_status_t) pjsip_auth_clt_init( pjsip_auth_clt_sess *sess, } +/* Deinit client session. */ +PJ_DEF(pj_status_t) pjsip_auth_clt_deinit(pjsip_auth_clt_sess *sess) +{ + pjsip_cached_auth *auth; + + PJ_ASSERT_RETURN(sess && sess->endpt, PJ_EINVAL); + + auth = sess->cached_auth.next; + while (auth != &sess->cached_auth) { + pjsip_endpt_release_pool(sess->endpt, auth->pool); + auth = auth->next; + } + + return PJ_SUCCESS; +} + + /* Clone session. */ PJ_DEF(pj_status_t) pjsip_auth_clt_clone( pj_pool_t *pool, pjsip_auth_clt_sess *sess, @@ -964,7 +981,7 @@ PJ_DEF(pj_status_t) pjsip_auth_clt_init_req( pjsip_auth_clt_sess *sess, static void recreate_cached_auth_pool( pjsip_endpoint *endpt, pjsip_cached_auth *auth ) { - pj_pool_t *auth_pool = pjsip_endpt_create_pool(endpt, "regc_auth%p", 1024, + pj_pool_t *auth_pool = pjsip_endpt_create_pool(endpt, "auth_cli%p", 1024, 1024); if (auth->realm.slen) { @@ -1163,7 +1180,7 @@ PJ_DEF(pj_status_t) pjsip_auth_clt_reinit_req( pjsip_auth_clt_sess *sess, if (!cached_auth) { cached_auth = PJ_POOL_ZALLOC_T(sess->pool, pjsip_cached_auth); cached_auth->pool = pjsip_endpt_create_pool(sess->endpt, - "regc_auth%p", + "auth_cli%p", 1024, 1024); pj_strdup(cached_auth->pool, &cached_auth->realm, diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c index 0e7fadcd..f03885d6 100644 --- a/pjsip/src/pjsip/sip_dialog.c +++ b/pjsip/src/pjsip/sip_dialog.c @@ -119,6 +119,7 @@ static void destroy_dialog( pjsip_dialog *dlg, pj_bool_t unlock_mutex ) pjsip_tpselector_dec_ref(&dlg->tp_sel); pj_bzero(&dlg->tp_sel, sizeof(pjsip_tpselector)); } + pjsip_auth_clt_deinit(&dlg->auth_sess); pjsip_endpt_release_pool(dlg->endpt, dlg->pool); } diff --git a/pjsip/src/pjsua-lib/pjsua_im.c b/pjsip/src/pjsua-lib/pjsua_im.c index 6ad8d677..dd0d2d88 100644 --- a/pjsip/src/pjsua-lib/pjsua_im.c +++ b/pjsip/src/pjsua-lib/pjsua_im.c @@ -387,8 +387,10 @@ static void im_callback(void *token, pjsip_event *e) im_data2, &im_callback); if (status == PJ_SUCCESS) { /* Done */ + pjsip_auth_clt_deinit(&auth); return; } + pjsip_auth_clt_deinit(&auth); } } @@ -489,8 +491,10 @@ static void typing_callback(void *token, pjsip_event *e) im_data2, &typing_callback); if (status == PJ_SUCCESS) { /* Done */ + pjsip_auth_clt_deinit(&auth); return; } + pjsip_auth_clt_deinit(&auth); } } -- cgit v1.2.3