mem: fix f_malloc big fragments bug
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Thu, 11 Mar 2010 20:08:20 +0000 (21:08 +0100)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Thu, 11 Mar 2010 20:16:12 +0000 (21:16 +0100)
In some situation, when dealing with several big free fragments
(>16k) f_malloc would wrongly choose a fragment with a smaller
size then requested. This would create the impression that someone
arbitrarily overwrites the memory.

First symptoms were some tls crashes reported by
Klaus Darilion  klaus.darilion@nic.at.
Reproduced using the malloc_test module.

mem/f_malloc.c

index c49a252..2c05fe6 100644 (file)
@@ -337,7 +337,7 @@ void* fm_malloc(struct fm_block* qm, unsigned long size)
        hash=fm_bmp_first_set(qm, GET_HASH(size));
        if (likely(hash>=0)){
                f=&(qm->free_hash[hash].first);
-       if (likely(hash<=F_MALLOC_OPTIMIZE)) /* return first match */
+       if (likely(hash<=F_MALLOC_OPTIMIZE/ROUNDTO)) /* return first match */
                        goto found; 
                for(;(*f); f=&((*f)->u.nxt_free))
                        if ((*f)->size>=size) goto found;
@@ -346,7 +346,7 @@ void* fm_malloc(struct fm_block* qm, unsigned long size)
        for(hash=GET_HASH(size);hash<F_HASH_SIZE;hash++){
                f=&(qm->free_hash[hash].first);
 #if 0
-               if (likely(hash<=F_MALLOC_OPTIMIZE)) /* return first match */
+               if (likely(hash<=F_MALLOC_OPTIMIZE/ROUNDTO)) /* return first match */
                                goto found; 
 #endif
                for(;(*f); f=&((*f)->u.nxt_free))