Fix incorrect KeeperBlock macro in bump.c
authorDavid Rowley <[email protected]>
Sun, 7 Apr 2024 23:06:31 +0000 (11:06 +1200)
committerDavid Rowley <[email protected]>
Sun, 7 Apr 2024 23:06:31 +0000 (11:06 +1200)
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

src/backend/utils/mmgr/bump.c

index a17d186c74269878a2eb195eca8fcc13b2568e5b..38e8159926227dc11b7393e853b8aca249897e93 100644 (file)
@@ -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);