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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2015-09-14T12:45:28+02:00

tm: test if transaction was suspended before resuming inside t_continue()

---

Modified: modules/tm/t_suspend.c

---

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

---

diff --git a/modules/tm/t_suspend.c b/modules/tm/t_suspend.c
index 67572b6..1ca56db 100644
--- a/modules/tm/t_suspend.c
+++ b/modules/tm/t_suspend.c
@@ -106,10 +106,10 @@ int t_suspend(struct sip_msg *msg,
                 * - failure route to be executed if the branch is not continued
                 *   before timeout */
                t->uac[t->async_backup.blind_uac].on_failure = t->on_failure;
+               t->flags |= T_ASYNC_SUSPENDED;
        } else {
                LM_DBG("this is a suspend on reply - setting msg flag to 
SUSPEND\n");
                msg->msg_flags |= FL_RPL_SUSPENDED;
-                t->flags |= T_ASYNC_SUSPENDED;
                /* this is a reply suspend find which branch */
 
                if (t_check( msg  , &branch )==-1){
@@ -131,6 +131,7 @@ int t_suspend(struct sip_msg *msg,
 
                LM_DBG("saving transaction data\n");
                t->uac[branch].reply->flags = msg->flags;
+               t->flags |= T_ASYNC_SUSPENDED;
        }
 
        *hash_index = t->hash_index;
@@ -176,7 +177,13 @@ int t_continue(unsigned int hash_index, unsigned int label,
                return -1;
        }
 
+       if (!(t->flags & T_ASYNC_SUSPENDED)) {
+               LM_ERR("transaction is not suspended [%u:%u]\n", hash_index, 
label);
+               return -2;
+       }
+
        if (t->flags & T_CANCELED) {
+               t->flags &= ~T_ASYNC_SUSPENDED;
                /* The transaction has already been canceled,
                 * needless to continue */
                UNREF(t); /* t_unref would kill the transaction */
@@ -219,6 +226,7 @@ int t_continue(unsigned int hash_index, unsigned int label,
                                /* Either t_continue() has already been
                                * called or the branch has already timed out.
                                * Needless to continue. */
+                               t->flags &= ~T_ASYNC_SUSPENDED;
                                UNLOCK_ASYNC_CONTINUE(t);
                                UNREF(t); /* t_unref would kill the transaction 
*/
                                return 1;
@@ -444,12 +452,14 @@ int t_continue(unsigned int hash_index, unsigned int 
label,
                t->uac[branch].reply = 0;
        }
 
-        t->flags &= ~T_ASYNC_SUSPENDED;   /*This transaction is no longer 
suspended so unsetting the SUSPEND flag*/
+       /*This transaction is no longer suspended so unsetting the SUSPEND 
flag*/
+       t->flags &= ~T_ASYNC_SUSPENDED;
 
 
        return 0;
 
 kill_trans:
+       t->flags &= ~T_ASYNC_SUSPENDED;
        /* The script has hopefully set the error code. If not,
         * let us reply with a default error. */
        if ((kill_transaction_unsafe(t,


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to