]> git.droids-corp.org - dpdk.git/commitdiff
mem: fix malloc element free in debug mode
authorXueming Li <xuemingl@mellanox.com>
Sat, 9 Sep 2017 07:33:19 +0000 (15:33 +0800)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 9 Oct 2017 21:15:45 +0000 (23:15 +0200)
malloc_elem_free() is clearing(setting to 0) the trailer cookie when
RTE_MALLOC_DEBUG is enabled. In case of joining free neighbor element,
part of joined memory is not getting cleared due to missing the length
of trailer cookie in the middle.

This patch fixes calculation of free memory length to be cleared in
malloc_elem_free() by including trailer cookie.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@mellanox.com>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
lib/librte_eal/common/malloc_elem.c

index 150769057b4d5a4b7a1ff4cd184e9ddbda74db10..889dffd21710abd5ad6921dcab658e9b71503e5e 100644 (file)
@@ -275,14 +275,14 @@ malloc_elem_free(struct malloc_elem *elem)
                return -1;
 
        rte_spinlock_lock(&(elem->heap->lock));
-       size_t sz = elem->size - sizeof(*elem);
+       size_t sz = elem->size - sizeof(*elem) - MALLOC_ELEM_TRAILER_LEN;
        uint8_t *ptr = (uint8_t *)&elem[1];
        struct malloc_elem *next = RTE_PTR_ADD(elem, elem->size);
        if (next->state == ELEM_FREE){
                /* remove from free list, join to this one */
                elem_free_list_remove(next);
                join_elem(elem, next);
-               sz += sizeof(*elem);
+               sz += (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
        }
 
        /* check if previous element is free, if so join with it and return,
@@ -291,8 +291,8 @@ malloc_elem_free(struct malloc_elem *elem)
        if (elem->prev != NULL && elem->prev->state == ELEM_FREE) {
                elem_free_list_remove(elem->prev);
                join_elem(elem->prev, elem);
-               sz += sizeof(*elem);
-               ptr -= sizeof(*elem);
+               sz += (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
+               ptr -= (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
                elem = elem->prev;
        }
        malloc_elem_free_list_insert(elem);