res_pjsip: Fix contact refleak on stateful responses.
authorMark Michelson <mmichelson@digium.com>
Wed, 2 Sep 2015 22:26:14 +0000 (17:26 -0500)
committerMark Michelson <mmichelson@digium.com>
Wed, 2 Sep 2015 22:28:18 +0000 (17:28 -0500)
When sending a stateful response, creation of the transaction can fail,
most commonly because we are trying to create a transaction from a
retransmitted request. When creation of the transaction fails, we end up
leaking a reference to a contact that was bumped when the response was
created.

This patch adds the missing deref and fixes the reference leak.

Change-Id: I2f97ad512aeb1b17e87ca29ae0abacb4d6395f07

res/res_pjsip.c

index 479b886..b8463ce 100644 (file)
@@ -3736,6 +3736,14 @@ int ast_sip_send_stateful_response(pjsip_rx_data *rdata, pjsip_tx_data *tdata, s
        pjsip_transaction *tsx;
 
        if (pjsip_tsx_create_uas(NULL, rdata, &tsx) != PJ_SUCCESS) {
+               struct ast_sip_contact *contact;
+
+               /* ast_sip_create_response bumps the refcount of the contact and adds it to the tdata.
+                * We'll leak that reference if we don't get rid of it here.
+                */
+               contact = ast_sip_mod_data_get(tdata->mod_data, supplement_module.id, MOD_DATA_CONTACT);
+               ao2_cleanup(contact);
+               ast_sip_mod_data_set(tdata->pool, tdata->mod_data, supplement_module.id, MOD_DATA_CONTACT, NULL);
                pjsip_tx_data_dec_ref(tdata);
                return -1;
        }