mirror of https://github.com/ipxe/ipxe.git
[malloc] Avoid false positive warnings from valgrind
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>pull/66/head
parent
75acb3c775
commit
42eedb04c1
|
@ -284,6 +284,7 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
||||||
size_t post_size;
|
size_t post_size;
|
||||||
struct memory_block *pre;
|
struct memory_block *pre;
|
||||||
struct memory_block *post;
|
struct memory_block *post;
|
||||||
|
unsigned int discarded;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
/* Sanity checks */
|
/* 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 */
|
/* 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 */
|
/* Nothing available to discard */
|
||||||
DBGC ( &heap, "Failed to allocate %#zx (aligned "
|
DBGC ( &heap, "Failed to allocate %#zx (aligned "
|
||||||
"%#zx)\n", size, align );
|
"%#zx)\n", size, align );
|
||||||
|
|
Loading…
Reference in New Issue