postgres.git / summary / log / commit / refs

commit    cdc04a6c339972a4c64b0978bf596f18ebdcff74
Author:   David Rowley <drowley@postgresql.org>
Date:     Thu Oct 30 01:50:05 2025 +0000
First released in: 13.23, 14.20, 15.15, 16.11, 17.7, 18.1

    Fix bogus use of "long" in AllocSetCheck()
    
    Because long is 32-bit on 64-bit Windows, it isn't a good datatype to
    store the difference between 2 pointers.  The under-sized type could
    overflow and lead to scary warnings in MEMORY_CONTEXT_CHECKING builds,
    such as:
    
    WARNING:  problem in alloc set ExecutorState: bad single-chunk %p in block %p
    
    However, the problem lies only in the code running the check, not from
    an actual memory accounting bug.
    
    Fix by using "Size" instead of "long".  This means using an unsigned
    type rather than the previous signed type.  If the block's freeptr was
    corrupted, we'd still catch that if the unsigned type wrapped.  Unsigned
    allows us to avoid further needless complexities around comparing signed
    and unsigned types.
    
    Author: David Rowley <dgrowleyml@gmail.com>
    Reviewed-by: Michael Paquier <michael@paquier.xyz>
    Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
    Backpatch-through: 13
    Discussion: https://postgr.es/m/CAApHDvo-RmiT4s33J=aC9C_-wPZjOXQ232V-EZFgKftSsNRi4w@mail.gmail.com


src/backend/utils/mmgr/aset.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c index 0bbbf93672e..e499c5f860a 100644 --- a/src/backend/utils/mmgr/aset.c +++ b/src/backend/utils/mmgr/aset.c @@ -1542,9 +1542,9 @@ AllocSetCheck(MemoryContext context) prevblock = block, block = block->next) { char *bpoz = ((char *) block) + ALLOC_BLOCKHDRSZ; - long blk_used = block->freeptr - bpoz; - long blk_data = 0; - long nchunks = 0; + Size blk_used = block->freeptr - bpoz; + Size blk_data = 0; + Size nchunks = 0; bool has_external_chunk = false; if (set->keeper == block) [parent: a546964db6fb]