Fix incorrect KeeperBlock macro in bump.c
The macro was missing a MAXALIGN around the sizeof(BumpContext) which would cause problems detecting the keeper block on 32-bit systems that have a MAXALIGN value of 8. Thank you to Andres Freund, Tomas Vondra and Tom Lane for investigating and testing. Reported-by: Melanie Plageman, Tomas Vondra Discussion: https://postgr.es/m/CAAKRu_Y6dZjiJEZghgNZp0Gjar1JVq-CH7XGDqExDVHnPgDjuw@mail.gmail.com Discussion: https://postgr.es/m/a4a10b89-6ba8-4abd-b449-019aafff04fc@enterprisedb.com
This commit is contained in:
parent
beabea6c20
commit
705ec05653
|
@ -57,7 +57,8 @@
|
|||
#define Bump_CHUNK_FRACTION 8
|
||||
|
||||
/* The keeper block is allocated in the same allocation as the set */
|
||||
#define KeeperBlock(set) ((BumpBlock *) ((char *) (set) + sizeof(BumpContext)))
|
||||
#define KeeperBlock(set) ((BumpBlock *) ((char *) (set) + \
|
||||
MAXALIGN(sizeof(BumpContext))))
|
||||
#define IsKeeperBlock(set, blk) (KeeperBlock(set) == (blk))
|
||||
|
||||
typedef struct BumpBlock BumpBlock; /* forward reference */
|
||||
|
@ -198,7 +199,7 @@ BumpContextCreate(MemoryContext parent, const char *name, Size minContextSize,
|
|||
dlist_init(&set->blocks);
|
||||
|
||||
/* Fill in the initial block's block header */
|
||||
block = (BumpBlock *) (((char *) set) + MAXALIGN(sizeof(BumpContext)));
|
||||
block = KeeperBlock(set);
|
||||
/* determine the block size and initialize it */
|
||||
firstBlockSize = allocSize - MAXALIGN(sizeof(BumpContext));
|
||||
BumpBlockInit(set, block, firstBlockSize);
|
||||
|
|
Loading…
Reference in New Issue