]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[malloc] Avoid false positive warnings from valgrind
authorMichael Brown <mcb30@ipxe.org>
Mon, 4 Sep 2017 13:00:32 +0000 (14:00 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 4 Sep 2017 13:09:17 +0000 (14:09 +0100)
Calling discard_cache() is likely to result in a call to
free_memblock(), which will call valgrind_make_blocks_noaccess()
before returning.  This causes valgrind to report an invalid read on
the next iteration through the loop in alloc_memblock().

Fix by explicitly calling valgrind_make_blocks_defined() after
discard_cache() returns.  Also call valgrind_make_blocks_noaccess()
before calling discard_cache(), to guard against free list corruption
while executing cache discarders.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/malloc.c

index 6ddc08b7a88772b730fa96e680e0f048534a88db..91c8e4d35d7e148328659bcf499df1326c38d2cd 100644 (file)
@@ -284,6 +284,7 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
        size_t post_size;
        struct memory_block *pre;
        struct memory_block *post;
+       unsigned int discarded;
        void *ptr;
 
        /* Sanity checks */
@@ -371,7 +372,13 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
                }
 
                /* Try discarding some cached data to free up memory */
-               if ( ! discard_cache() ) {
+               DBGC ( &heap, "Attempting discard for %#zx (aligned %#zx+%zx), "
+                      "used %zdkB\n", size, align, offset, ( usedmem >> 10 ) );
+               valgrind_make_blocks_noaccess();
+               discarded = discard_cache();
+               valgrind_make_blocks_defined();
+               check_blocks();
+               if ( ! discarded ) {
                        /* Nothing available to discard */
                        DBGC ( &heap, "Failed to allocate %#zx (aligned "
                               "%#zx)\n", size, align );