summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-06-30 08:23:08 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-06-30 08:23:08 +0000
commit2853944b8b3887300705dfd09139b1ab32e0c86c (patch)
tree8928e772ed8aee473eff8a66a8996710b8574282
parent9f00edeb8f23f0788e3e13f561a2c5c1b3f14503 (diff)
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
-rw-r--r--pjsip/include/pjsip/sip_auth.h10
-rw-r--r--pjsip/src/pjsip-simple/publishc.c2
-rw-r--r--pjsip/src/pjsip-ua/sip_reg.c8
-rw-r--r--pjsip/src/pjsip/sip_auth_client.c21
-rw-r--r--pjsip/src/pjsip/sip_dialog.c1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_im.c4
6 files changed, 37 insertions, 9 deletions
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
@@ -342,6 +342,16 @@ PJ_DECL(pj_status_t) pjsip_auth_clt_init( pjsip_auth_clt_sess *sess,
/**
+ * 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.
*
* @param pool Pool to use.
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(&regc->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 != &regc->auth_sess.cached_auth) {
- pjsip_endpt_release_pool(regc->endpt, auth->pool);
- auth = auth->next;
- }
-
+ pjsip_auth_clt_deinit(&regc->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);
}
}