Module: kamailio
Branch: master
Commit: e4a11d715e3d4e47aa82b7e8e358000948e26c4c
URL: 
https://github.com/kamailio/kamailio/commit/e4a11d715e3d4e47aa82b7e8e358000948e26c4c

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date: 2017-04-06T17:06:37+02:00

dialog: check if dialog exists after event route execution

- done for dlg_onroute(), as an extra safety for early detection of
  races, related to GH #1059

---

Modified: src/modules/dialog/dlg_handlers.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/e4a11d715e3d4e47aa82b7e8e358000948e26c4c.diff
Patch: 
https://github.com/kamailio/kamailio/commit/e4a11d715e3d4e47aa82b7e8e358000948e26c4c.patch

---

diff --git a/src/modules/dialog/dlg_handlers.c 
b/src/modules/dialog/dlg_handlers.c
index 539d248..2eb36f5 100644
--- a/src/modules/dialog/dlg_handlers.c
+++ b/src/modules/dialog/dlg_handlers.c
@@ -1226,12 +1226,14 @@ dlg_cell_t *dlg_get_msg_dialog(sip_msg_t *msg)
  */
 void dlg_onroute(struct sip_msg* req, str *route_params, void *param)
 {
-       dlg_cell_t *dlg;
-       dlg_iuid_t *iuid;
+       dlg_cell_t *dlg = NULL;
+       dlg_cell_t *dlg0 = NULL;
+       dlg_iuid_t *iuid = NULL;
        str val, callid, ftag, ttag;
-       int h_entry, h_id, new_state, old_state, unref, event, timeout, reset;
-       unsigned int dir;
-       int ret = 0;
+       int h_entry=0, h_id=0, new_state=0, old_state=0;
+       int unref=0, event=0, timeout=0, reset=0;
+       unsigned int dir=0;
+       int ret=0;
 
        dlg = dlg_get_ctx_dialog();
        if (dlg!=NULL) {
@@ -1321,8 +1323,10 @@ void dlg_onroute(struct sip_msg* req, str *route_params, 
void *param)
 
     /* set current dialog - re-use ref increment from dlg_get() above */
     set_current_dialog( req, dlg);
-    _dlg_ctx.iuid.h_entry = dlg->h_entry;
-    _dlg_ctx.iuid.h_id = dlg->h_id;
+    h_entry = dlg->h_entry;
+    h_id = dlg->h_id;
+    _dlg_ctx.iuid.h_entry = h_entry;
+    _dlg_ctx.iuid.h_id = h_id;
 
        if(dlg->iflags & DLG_IFLAG_CSEQ_DIFF) {
                if(dlg_cseq_refresh(req, dlg, dir)<0) {
@@ -1364,6 +1368,15 @@ void dlg_onroute(struct sip_msg* req, str *route_params, 
void *param)
 
        dlg_run_event_route(dlg, req, old_state, new_state);
 
+       dlg0 = dlg_lookup(h_entry, h_id);
+       if (dlg0==0) {
+               LM_ALERT("after event route - dialog not found [%u:%u] (%d/%d) 
(%p)\n",
+                               h_entry, h_id, old_state, new_state, dlg);
+               return;
+       } else {
+               dlg_release(dlg0);
+       }
+
        /* delay deletion of dialog until transaction has died off in order
         * to absorb in-air messages */
        if (new_state==DLG_STATE_DELETED && old_state!=DLG_STATE_DELETED) {


_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to