]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Fix tdata leaks in off nominal paths. 84/4384/1
authorRichard Mudgett <rmudgett@digium.com>
Wed, 21 Sep 2016 20:10:29 +0000 (15:10 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 10 Nov 2016 22:14:55 +0000 (16:14 -0600)
Change-Id: Ie83e06e88c2d60157775263b07e40b61718ac97b

res/res_pjsip.c
res/res_pjsip_outbound_registration.c
res/res_pjsip_pubsub.c

index 153352f9facb2ee25a93dbcd51da90d6002c871b..8ac63204b660d0106e889b260374dbdf5f47f5b1 100644 (file)
@@ -3555,6 +3555,7 @@ static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint,
                                pj_strbuf(&tdata->msg->line.req.method.name),
                                endpoint ? ast_sorcery_object_get_id(endpoint) : "<unknown>");
                        ao2_t_ref(req_wrapper, -2, "Drop timer and routine ref");
+                       pjsip_tx_data_dec_ref(tdata);
                        return ret_val;
                }
 
index 6f17b207296dd3b08479ca7d205ea7f4b2b9b107..ff6619477b712750df82f696b52acf5f4097c7ab 100644 (file)
@@ -514,6 +514,7 @@ static pj_status_t registration_client_send(struct sip_outbound_registration_cli
 
        callback_invoked = ast_threadstorage_get(&register_callback_invoked, sizeof(int));
        if (!callback_invoked) {
+               pjsip_tx_data_dec_ref(tdata);
                return PJ_ENOMEM;
        }
        *callback_invoked = 0;
@@ -567,6 +568,7 @@ static int handle_client_registration(void *data)
                        /* insert a new Supported header */
                        hdr = pjsip_supported_hdr_create(tdata->pool);
                        if (!hdr) {
+                               pjsip_tx_data_dec_ref(tdata);
                                return -1;
                        }
 
index 2fa7f34e3b7938f45ca48c35a58a3af091b4b478..f6b6efcf57930019e7dd4e495c573446e66493b0 100644 (file)
@@ -1824,6 +1824,7 @@ static int sip_subscription_send_request(struct sip_subscription_tree *sub_tree,
 
        if (allocate_tdata_buffer(tdata)) {
                ast_log(LOG_ERROR, "SIP request %s is too large to send.\n", tdata->info);
+               pjsip_tx_data_dec_ref(tdata);
                return -1;
        }
 
@@ -2977,7 +2978,6 @@ static struct ast_sip_publication *sip_create_publication(struct ast_sip_endpoin
 static int sip_publication_respond(struct ast_sip_publication *pub, int status_code,
                pjsip_rx_data *rdata)
 {
-       pj_status_t status;
        pjsip_tx_data *tdata;
        pjsip_transaction *tsx;
 
@@ -2986,26 +2986,24 @@ static int sip_publication_respond(struct ast_sip_publication *pub, int status_c
        }
 
        if (PJSIP_IS_STATUS_IN_CLASS(status_code, 200)) {
-               RAII_VAR(char *, entity_tag, NULL, ast_free_ptr);
-               RAII_VAR(char *, expires, NULL, ast_free_ptr);
+               char buf[30];
 
-               if ((ast_asprintf(&entity_tag, "%d", pub->entity_tag) < 0) ||
-                       (ast_asprintf(&expires, "%d", pub->expires) < 0)) {
-                       pjsip_tx_data_dec_ref(tdata);
-                       return -1;
-               }
+               snprintf(buf, sizeof(buf), "%d", pub->entity_tag);
+               ast_sip_add_header(tdata, "SIP-ETag", buf);
 
-               ast_sip_add_header(tdata, "SIP-ETag", entity_tag);
-               ast_sip_add_header(tdata, "Expires", expires);
+               snprintf(buf, sizeof(buf), "%d", pub->expires);
+               ast_sip_add_header(tdata, "Expires", buf);
        }
 
-       if ((status = pjsip_tsx_create_uas(&pubsub_module, rdata, &tsx)) != PJ_SUCCESS) {
+       if (pjsip_tsx_create_uas(&pubsub_module, rdata, &tsx) != PJ_SUCCESS) {
+               pjsip_tx_data_dec_ref(tdata);
                return -1;
        }
 
        pjsip_tsx_recv_msg(tsx, rdata);
 
        if (pjsip_tsx_send_msg(tsx, tdata) != PJ_SUCCESS) {
+               pjsip_tx_data_dec_ref(tdata);
                return -1;
        }