mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Add some debug support code to try to catch future mistakes in the area of
input functions that include garbage bytes in their results. Provide a compile-time option RANDOMIZE_ALLOCATED_MEMORY to make palloc fill returned blocks with variable contents. This option also makes the parser perform conversions of literal constants twice and compare the results, emitting a WARNING if they don't match. (This is the code I used to catch the input function bugs fixed in the previous commit.) For the moment, I've set it to be activated automatically by --enable-cassert.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user