Module: sip-router
Branch: master
Commit: 2376c833aad92bf8661f985d5917d952874a7509
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2376c833aad92bf8661f985d5917d952874a7509

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date:   Mon Mar 24 22:53:22 2014 +0100

dialog: lock for updating the cseq

- race can happen on processing two requests at the same time within
  same dialog

---

 modules/dialog/dlg_hash.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/modules/dialog/dlg_hash.c b/modules/dialog/dlg_hash.c
index d8b2759..5afece8 100644
--- a/modules/dialog/dlg_hash.c
+++ b/modules/dialog/dlg_hash.c
@@ -585,7 +585,12 @@ int dlg_set_leg_info(struct dlg_cell *dlg, str* tag, str 
*rr, str *contact,
  * \return 0 on success, -1 on failure
  */
 int dlg_update_cseq(struct dlg_cell * dlg, unsigned int leg, str *cseq)
-{
+{      dlg_entry_t *d_entry;
+
+       d_entry = &(d_table->entries[dlg->h_entry]);
+
+       dlg_lock(d_table, d_entry);
+
        if ( dlg->cseq[leg].s ) {
                if (dlg->cseq[leg].len < cseq->len) {
                        shm_free(dlg->cseq[leg].s);
@@ -602,9 +607,12 @@ int dlg_update_cseq(struct dlg_cell * dlg, unsigned int 
leg, str *cseq)
        memcpy( dlg->cseq[leg].s, cseq->s, cseq->len );
        dlg->cseq[leg].len = cseq->len;
 
-       LM_DBG("cseq is %.*s\n", dlg->cseq[leg].len, dlg->cseq[leg].s);
+       LM_DBG("cseq of leg[%d] is %.*s\n", leg,
+                       dlg->cseq[leg].len, dlg->cseq[leg].s);
+       dlg_unlock(d_table, d_entry);
        return 0;
 error:
+       dlg_unlock(d_table, d_entry);
        LM_ERR("not more shm mem\n");
        return -1;
 }


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

Reply via email to