diff options
author | Joshua Colp <jcolp@digium.com> | 2013-07-25 00:44:24 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2013-07-25 00:44:24 +0000 |
commit | 71609d58aa8e8cd9d0cbc4e2a29ab20d19599c27 (patch) | |
tree | f5f9721b85b505aee022176ee78a91bdac812dc4 /res/res_sip/sip_distributor.c | |
parent | 517eb93873e6d706aea355c44ecf1eba61571375 (diff) |
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
Diffstat (limited to 'res/res_sip/sip_distributor.c')
-rw-r--r-- | res/res_sip/sip_distributor.c | 17 |
1 files changed, 15 insertions, 2 deletions
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); } |