Fix chunk_unmap() to propagate dirty state.

Fix chunk_unmap() to propagate whether a chunk is dirty, and modify
dirty chunk purging to record this information so it can be passed to
chunk_unmap().  Since the broken version of chunk_unmap() claimed that
all chunks were clean, this resulted in potential memory corruption for
purging implementations that do not zero (e.g. MADV_FREE).

This regression was introduced by
ee41ad409a (Integrate whole chunks into
unused dirty page purging machinery.).
This commit is contained in:
Jason Evans
2015-02-17 22:25:56 -08:00
parent 47701b22ee
commit 339c2b23b2
3 changed files with 14 additions and 8 deletions

View File

@@ -377,7 +377,7 @@ chunk_dalloc_default(void *chunk, size_t size, unsigned arena_ind)
}
void
chunk_unmap(arena_t *arena, void *chunk, size_t size)
chunk_unmap(arena_t *arena, bool dirty, void *chunk, size_t size)
{
assert(chunk != NULL);
@@ -387,10 +387,10 @@ chunk_unmap(arena_t *arena, void *chunk, size_t size)
if (have_dss && chunk_in_dss(chunk)) {
chunk_record(arena, &arena->chunks_szad_dss,
&arena->chunks_ad_dss, false, chunk, size);
&arena->chunks_ad_dss, dirty, chunk, size);
} else if (chunk_dalloc_mmap(chunk, size)) {
chunk_record(arena, &arena->chunks_szad_mmap,
&arena->chunks_ad_mmap, false, chunk, size);
&arena->chunks_ad_mmap, dirty, chunk, size);
}
}