From 71609d58aa8e8cd9d0cbc4e2a29ab20d19599c27 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 25 Jul 2013 00:44:24 +0000 Subject: Improve initial INVITE handling and fix crash due to rapidly arriving CANCEL. (closes issue ASTERISK-22150) Review: https://reviewboard.asterisk.org/r/2696/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@395351 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_sip/sip_distributor.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'res/res_sip/sip_distributor.c') diff --git a/res/res_sip/sip_distributor.c b/res/res_sip/sip_distributor.c index 6ddc0e70a..95b28c0e7 100644 --- a/res/res_sip/sip_distributor.c +++ b/res/res_sip/sip_distributor.c @@ -99,17 +99,30 @@ static pj_bool_t distributor(pjsip_rx_data *rdata) struct ast_taskprocessor *serializer = NULL; pjsip_rx_data *clone; - pjsip_rx_data_clone(rdata, 0, &clone); if (dlg) { dist = pjsip_dlg_get_mod_data(dlg, distributor_mod.id); if (dist) { serializer = dist->serializer; - clone->endpt_info.mod_data[distributor_mod.id] = dist->endpoint; } } + if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG && ( + !pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_cancel_method) || + !pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_bye_method)) && + !serializer) { + pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 481, NULL, NULL, NULL); + goto end; + } + + pjsip_rx_data_clone(rdata, 0, &clone); + + if (dist) { + clone->endpt_info.mod_data[distributor_mod.id] = dist->endpoint; + } + ast_sip_push_task(serializer, distribute, clone); +end: if (dlg) { pjsip_dlg_dec_lock(dlg); } -- cgit v1.2.3