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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2015-09-23T13:56:20+02:00

mem: f_malloc - don't use references to pointers of nxt_free field

---

Modified: mem/f_malloc.c

---

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

---

diff --git a/mem/f_malloc.c b/mem/f_malloc.c
index 861cfd9..55c48ec 100644
--- a/mem/f_malloc.c
+++ b/mem/f_malloc.c
@@ -442,7 +442,7 @@ void* fm_malloc(void* qmp, unsigned long size)
 #endif
 {
        struct fm_block* qm;
-       struct fm_frag** f;
+       struct fm_frag* f;
        struct fm_frag* frag;
        int hash;
 
@@ -463,8 +463,8 @@ void* fm_malloc(void* qmp, unsigned long size)
        hash=fm_bmp_first_set(qm, GET_HASH(size));
        if (likely(hash>=0)){
                if (likely(hash<=F_MALLOC_OPTIMIZE/ROUNDTO)) { /* return first 
match */
-                       f=&(qm->free_hash[hash].first);
-                       if(likely(*f)) goto found;
+                       f=qm->free_hash[hash].first;
+                       if(likely(f && f!=qm->last_frag)) goto found;
 #ifdef DBG_F_MALLOC
                        MDBG(" block %p hash %d empty but no. is %lu\n", qm,
                                        hash, qm->free_hash[hash].no);
@@ -482,17 +482,17 @@ void* fm_malloc(void* qmp, unsigned long size)
                   hash buckets.
                */
                do {
-                       for(f=&(qm->free_hash[hash].first);(*f); 
f=&((*f)->u.nxt_free))
-                               if ((*f)->size>=size) goto found;
+                       for(f=qm->free_hash[hash].first; f && f!=qm->last_frag; 
f=f->u.nxt_free)
+                               if (f->size>=size) goto found;
                        hash++; /* try in next hash cell */
                }while((hash < F_HASH_SIZE) &&
                                ((hash=fm_bmp_first_set(qm, hash)) >= 0));
        }
 #else /* F_MALLOC_HASH_BITMAP */
        for(hash=GET_HASH(size);hash<F_HASH_SIZE;hash++){
-               f=&(qm->free_hash[hash].first);
-               for(;(*f); f=&((*f)->u.nxt_free))
-                       if ((*f)->size>=size) goto found;
+               f=qm->free_hash[hash].first;
+               for(;f && f!=qm->last_frag; f=f->u.nxt_free)
+                       if (f->size>=size) goto found;
                /* try in a bigger bucket */
        }
 #endif /* F_MALLOC_HASH_BITMAP */
@@ -507,7 +507,7 @@ void* fm_malloc(void* qmp, unsigned long size)
 found:
        /* we found it!*/
        /* detach it from the free list*/
-       frag=*f;
+       frag=f;
        fm_extract_free(qm, frag);
 
        /*see if use full frag or split it in two*/


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

Reply via email to