diff options
Diffstat (limited to 'src/backend/utils/mmgr/aset.c')
-rw-r--r-- | src/backend/utils/mmgr/aset.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c index 81f73f963d5..a6ac6ab0325 100644 --- a/src/backend/utils/mmgr/aset.c +++ b/src/backend/utils/mmgr/aset.c @@ -11,7 +11,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.76 2008/01/01 19:45:55 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.77 2008/04/11 22:54:23 tgl Exp $ * * NOTE: * This is a new (Feb. 05, 1999) implementation of the allocation set @@ -282,6 +282,32 @@ AllocSetFreeIndex(Size size) return idx; } +#ifdef RANDOMIZE_ALLOCATED_MEMORY + +/* + * Fill a just-allocated piece of memory with "random" data. It's not really + * very random, just a repeating sequence with a length that's prime. What + * we mainly want out of it is to have a good probability that two palloc's + * of the same number of bytes start out containing different data. + */ +static void +randomize_mem(char *ptr, size_t size) +{ + static int save_ctr = 1; + int ctr; + + ctr = save_ctr; + while (size-- > 0) + { + *ptr++ = ctr; + if (++ctr > 251) + ctr = 1; + } + save_ctr = ctr; +} + +#endif /* RANDOMIZE_ALLOCATED_MEMORY */ + /* * Public routines @@ -552,6 +578,10 @@ AllocSetAlloc(MemoryContext context, Size size) if (size < chunk_size) ((char *) AllocChunkGetPointer(chunk))[size] = 0x7E; #endif +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) AllocChunkGetPointer(chunk), size); +#endif /* * Stick the new block underneath the active allocation block, so that @@ -596,6 +626,10 @@ AllocSetAlloc(MemoryContext context, Size size) if (size < chunk->size) ((char *) AllocChunkGetPointer(chunk))[size] = 0x7E; #endif +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) AllocChunkGetPointer(chunk), size); +#endif /* isReset must be false already */ Assert(!set->isReset); @@ -752,6 +786,10 @@ AllocSetAlloc(MemoryContext context, Size size) if (size < chunk->size) ((char *) AllocChunkGetPointer(chunk))[size] = 0x7E; #endif +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) AllocChunkGetPointer(chunk), size); +#endif set->isReset = false; @@ -864,6 +902,13 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size) if (oldsize >= size) { #ifdef MEMORY_CONTEXT_CHECKING +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* We can only fill the extra space if we know the prior request */ + if (size > chunk->requested_size) + randomize_mem((char *) AllocChunkGetPointer(chunk) + chunk->requested_size, + size - chunk->requested_size); +#endif + chunk->requested_size = size; /* set mark to catch clobber of "unused" space */ if (size < oldsize) @@ -921,6 +966,12 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size) chunk->size = chksize; #ifdef MEMORY_CONTEXT_CHECKING +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* We can only fill the extra space if we know the prior request */ + randomize_mem((char *) AllocChunkGetPointer(chunk) + chunk->requested_size, + size - chunk->requested_size); +#endif + chunk->requested_size = size; /* set mark to catch clobber of "unused" space */ if (size < chunk->size) |