Module: kamailio
Branch: 4.4
Commit: 84d73b950f3ec13fe5f5345a4440d0909e30fff4
URL: 
https://github.com/kamailio/kamailio/commit/84d73b950f3ec13fe5f5345a4440d0909e30fff4

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2016-03-14T11:47:59+01:00

tsilo: lock before linking var to the entry in slot

- entry points to the address of first entry, which can be updated
  before aquiring the lock

(cherry picked from commit 8ae2713477027a229ae4ee7045557151e467aff3)

---

Modified: modules/tsilo/ts_rpc.c

---

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

---

diff --git a/modules/tsilo/ts_rpc.c b/modules/tsilo/ts_rpc.c
index 20783f4..7a3b659 100644
--- a/modules/tsilo/ts_rpc.c
+++ b/modules/tsilo/ts_rpc.c
@@ -45,6 +45,9 @@ static inline int rpc_dump_transaction(rpc_t* rpc, void* ctx, 
void *ih, ts_trans
 {
        void* vh;
 
+       if(t==NULL)
+               return -1;
+
        if(rpc->struct_add(ih, "{", "Transaction", &vh)<0)
        {
                rpc->fault(ctx, 500, "Internal error creating transaction 
struct");
@@ -73,9 +76,9 @@ static inline int rpc_dump_transaction(rpc_t* rpc, void* ctx, 
void *ih, ts_trans
  */
 static void rpc_tsilo_dump(rpc_t *rpc, void *c)
 {
-       ts_transaction_t* trans;
-       struct ts_urecord* record;
-       struct ts_entry* entry;
+       ts_transaction_t* trans = NULL;
+       struct ts_urecord* record = NULL;
+       struct ts_entry* entry = NULL;
 
        str brief = {0, 0};
 
@@ -115,8 +118,8 @@ static void rpc_tsilo_dump(rpc_t *rpc, void *c)
 
        /* add the entries per hash */
        for(i=0,n=0,max=0,ntrans=0; i<t_table->size; i++) {
+               lock_entry(&t_table->entries[i]);
                entry = &t_table->entries[i];
-               lock_entry(entry);
 
                n += entry->n;
                if(max<entry->n)
@@ -130,7 +133,7 @@ static void rpc_tsilo_dump(rpc_t *rpc, void *c)
                                        "Hash", record->rurihash,
                                        "Transactions", &ih)<0)
                                {
-                                       unlock_entry(entry);
+                                       unlock_entry(&t_table->entries[i]);
                                        rpc->fault(c, 500, "Internal error 
creating ruri struct");
                                        return;
                                }
@@ -139,13 +142,13 @@ static void rpc_tsilo_dump(rpc_t *rpc, void *c)
                                ntrans += 1;
                                if (short_dump==0) {
                                        if (rpc_dump_transaction(rpc, c, ih, 
trans) == -1) {
-                                               unlock_entry(entry);
+                                               
unlock_entry(&t_table->entries[i]);
                                                return;
                                        }
                                }
                        }
                }
-               unlock_entry(entry);
+               unlock_entry(&t_table->entries[i]);
        }
 
        /* extra attributes node */


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

Reply via email to