mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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
This commit is contained in:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user