summaryrefslogtreecommitdiff
path: root/res/res_sip/sip_distributor.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-07-25 00:44:24 +0000
committerJoshua Colp <jcolp@digium.com>2013-07-25 00:44:24 +0000
commit71609d58aa8e8cd9d0cbc4e2a29ab20d19599c27 (patch)
treef5f9721b85b505aee022176ee78a91bdac812dc4 /res/res_sip/sip_distributor.c
parent517eb93873e6d706aea355c44ecf1eba61571375 (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.c17
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);
}