0003-Don-t-rely-on-pointer-arithmetic-with-Pointer-type.patch

text/plain

Filename: 0003-Don-t-rely-on-pointer-arithmetic-with-Pointer-type.patch
Type: text/plain
Part: 2
Message: get rid of Pointer type, mostly

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch 0003
Subject: Don't rely on pointer arithmetic with Pointer type
File+
contrib/bloom/bloom.h 1 1
contrib/bloom/blutils.c 2 2
contrib/bloom/blvacuum.c 1 1
src/backend/access/gin/gindatapage.c 9 9
src/backend/access/gin/ginxlog.c 10 10
src/backend/access/rmgrdesc/genericdesc.c 2 2
src/backend/utils/adt/multirangetypes.c 16 16
src/backend/utils/adt/rangetypes.c 8 8
From 08e6993de9f0ab2b75f023789905770b08b0f03b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 3/6] Don't rely on pointer arithmetic with Pointer type

Use char * explicitly where this is needed.
---
 contrib/bloom/bloom.h                     |  2 +-
 contrib/bloom/blutils.c                   |  4 +--
 contrib/bloom/blvacuum.c                  |  2 +-
 src/backend/access/gin/gindatapage.c      | 18 ++++++-------
 src/backend/access/gin/ginxlog.c          | 20 +++++++-------
 src/backend/access/rmgrdesc/genericdesc.c |  4 +--
 src/backend/utils/adt/multirangetypes.c   | 32 +++++++++++------------
 src/backend/utils/adt/rangetypes.c        | 16 ++++++------
 8 files changed, 49 insertions(+), 49 deletions(-)

diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h
index 648167045f4..b2966d37077 100644
--- a/contrib/bloom/bloom.h
+++ b/contrib/bloom/bloom.h
@@ -72,7 +72,7 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
 	((BloomTuple *)(PageGetContents(page) \
 		+ (state)->sizeOfBloomTuple * ((offset) - 1)))
 #define BloomPageGetNextTuple(state, tuple) \
-	((BloomTuple *)((Pointer)(tuple) + (state)->sizeOfBloomTuple))
+	((BloomTuple *)((char *)(tuple) + (state)->sizeOfBloomTuple))
 
 /* Preserved page numbers */
 #define BLOOM_METAPAGE_BLKNO	(0)
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index bf50037a71a..bbeefc3a75b 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -324,7 +324,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
 {
 	BloomTuple *itup;
 	BloomPageOpaque opaque;
-	Pointer		ptr;
+	char	   *ptr;
 
 	/* We shouldn't be pointed to an invalid page */
 	Assert(!PageIsNew(page) && !BloomPageIsDeleted(page));
@@ -340,7 +340,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
 
 	/* Adjust maxoff and pd_lower */
 	opaque->maxoff++;
-	ptr = (Pointer) BloomPageGetTuple(state, page, opaque->maxoff + 1);
+	ptr = (char *) BloomPageGetTuple(state, page, opaque->maxoff + 1);
 	((PageHeader) page)->pd_lower = ptr - page;
 
 	/* Assert we didn't overrun available space */
diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c
index 044fd85a32a..cc0639a3ac4 100644
--- a/contrib/bloom/blvacuum.c
+++ b/contrib/bloom/blvacuum.c
@@ -122,7 +122,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 			if (BloomPageGetMaxOffset(page) == 0)
 				BloomPageSetDeleted(page);
 			/* Adjust pd_lower */
-			((PageHeader) page)->pd_lower = (Pointer) itupPtr - page;
+			((PageHeader) page)->pd_lower = (char *) itupPtr - page;
 			/* Finish WAL-logging */
 			GenericXLogFinish(gxlogState);
 		}
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c
index 6c2c6194720..e677bdb2dcb 100644
--- a/src/backend/access/gin/gindatapage.c
+++ b/src/backend/access/gin/gindatapage.c
@@ -140,20 +140,20 @@ GinDataLeafPageGetItems(Page page, int *nitems, ItemPointerData advancePast)
 	{
 		GinPostingList *seg = GinDataLeafPageGetPostingList(page);
 		Size		len = GinDataLeafPageGetPostingListSize(page);
-		Pointer		endptr = ((Pointer) seg) + len;
+		char	   *endptr = ((char *) seg) + len;
 		GinPostingList *next;
 
 		/* Skip to the segment containing advancePast+1 */
 		if (ItemPointerIsValid(&advancePast))
 		{
 			next = GinNextPostingListSegment(seg);
-			while ((Pointer) next < endptr &&
+			while ((char *) next < endptr &&
 				   ginCompareItemPointers(&next->first, &advancePast) <= 0)
 			{
 				seg = next;
 				next = GinNextPostingListSegment(seg);
 			}
-			len = endptr - (Pointer) seg;
+			len = endptr - (char *) seg;
 		}
 
 		if (len > 0)
@@ -1371,8 +1371,8 @@ disassembleLeaf(Page page)
 {
 	disassembledLeaf *leaf;
 	GinPostingList *seg;
-	Pointer		segbegin;
-	Pointer		segend;
+	char	   *segbegin;
+	char	   *segend;
 
 	leaf = palloc0(sizeof(disassembledLeaf));
 	dlist_init(&leaf->segments);
@@ -1383,9 +1383,9 @@ disassembleLeaf(Page page)
 		 * Create a leafSegmentInfo entry for each segment.
 		 */
 		seg = GinDataLeafPageGetPostingList(page);
-		segbegin = (Pointer) seg;
+		segbegin = (char *) seg;
 		segend = segbegin + GinDataLeafPageGetPostingListSize(page);
-		while ((Pointer) seg < segend)
+		while ((char *) seg < segend)
 		{
 			leafSegmentInfo *seginfo = palloc(sizeof(leafSegmentInfo));
 
@@ -1779,7 +1779,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems,
 	Buffer		buffer;
 	Page		tmppage;
 	Page		page;
-	Pointer		ptr;
+	char	   *ptr;
 	int			nrootitems;
 	int			rootsize;
 	bool		is_build = (buildStats != NULL);
@@ -1795,7 +1795,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems,
 	 */
 	nrootitems = 0;
 	rootsize = 0;
-	ptr = (Pointer) GinDataLeafPageGetPostingList(tmppage);
+	ptr = (char *) GinDataLeafPageGetPostingList(tmppage);
 	while (nrootitems < nitems)
 	{
 		GinPostingList *segment;
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 606741fa396..34c01a01165 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -119,12 +119,12 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 	int			actionno;
 	int			segno;
 	GinPostingList *oldseg;
-	Pointer		segmentend;
+	char	   *segmentend;
 	char	   *walbuf;
 	int			totalsize;
-	Pointer		tailCopy = NULL;
-	Pointer		writePtr;
-	Pointer		segptr;
+	void	   *tailCopy = NULL;
+	char	   *writePtr;
+	char	   *segptr;
 
 	/*
 	 * If the page is in pre-9.4 format, convert to new format first.
@@ -164,8 +164,8 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 	}
 
 	oldseg = GinDataLeafPageGetPostingList(page);
-	writePtr = (Pointer) oldseg;
-	segmentend = (Pointer) oldseg + GinDataLeafPageGetPostingListSize(page);
+	writePtr = (char *) oldseg;
+	segmentend = (char *) oldseg + GinDataLeafPageGetPostingListSize(page);
 	segno = 0;
 
 	walbuf = ((char *) data) + sizeof(ginxlogRecompressDataLeaf);
@@ -243,7 +243,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 			a_action = GIN_SEGMENT_REPLACE;
 		}
 
-		segptr = (Pointer) oldseg;
+		segptr = (char *) oldseg;
 		if (segptr != segmentend)
 			segsize = SizeOfGinPostingList(oldseg);
 		else
@@ -264,7 +264,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 		{
 			int			tailSize = segmentend - segptr;
 
-			tailCopy = (Pointer) palloc(tailSize);
+			tailCopy = palloc(tailSize);
 			memcpy(tailCopy, segptr, tailSize);
 			segptr = tailCopy;
 			oldseg = (GinPostingList *) segptr;
@@ -301,7 +301,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 	}
 
 	/* Copy the rest of unmodified segments if any. */
-	segptr = (Pointer) oldseg;
+	segptr = (char *) oldseg;
 	if (segptr != segmentend && tailCopy)
 	{
 		int			restSize = segmentend - segptr;
@@ -311,7 +311,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 		writePtr += restSize;
 	}
 
-	totalsize = writePtr - (Pointer) GinDataLeafPageGetPostingList(page);
+	totalsize = writePtr - (char *) GinDataLeafPageGetPostingList(page);
 	GinDataPageSetDataSize(page, totalsize);
 }
 
diff --git a/src/backend/access/rmgrdesc/genericdesc.c b/src/backend/access/rmgrdesc/genericdesc.c
index 75dc4108b9a..29a4c9e894b 100644
--- a/src/backend/access/rmgrdesc/genericdesc.c
+++ b/src/backend/access/rmgrdesc/genericdesc.c
@@ -23,8 +23,8 @@
 void
 generic_desc(StringInfo buf, XLogReaderState *record)
 {
-	Pointer		ptr = XLogRecGetData(record),
-				end = ptr + XLogRecGetDataLen(record);
+	const char *ptr = XLogRecGetData(record);
+	const char *end = ptr + XLogRecGetDataLen(record);
 
 	while (ptr < end)
 	{
diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
index 55e0b4fdc31..e259644c6ca 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -68,11 +68,11 @@ typedef enum
  * Macros for accessing past MultirangeType parts of multirange: items, flags
  * and boundaries.
  */
-#define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
+#define MultirangeGetItemsPtr(mr) ((uint32 *) ((char *) (mr) + \
 	sizeof(MultirangeType)))
-#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
+#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((char *) (mr) + \
 	sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
-#define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (mr) + \
+#define MultirangeGetBoundariesPtr(mr, align) ((char *) (mr) + \
 	att_align_nominal(sizeof(MultirangeType) + \
 		((mr)->rangeCount - 1) * sizeof(uint32) + \
 		(mr)->rangeCount * sizeof(uint8), (align)))
@@ -602,13 +602,13 @@ write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp,
 	uint32		prev_offset = 0;
 	uint8	   *flags;
 	int32		i;
-	Pointer		begin,
-				ptr;
+	const char *begin;
+	char	   *ptr;
 	char		elemalign = rangetyp->rngelemtype->typalign;
 
 	items = MultirangeGetItemsPtr(multirange);
 	flags = MultirangeGetFlagsPtr(multirange);
-	ptr = begin = MultirangeGetBoundariesPtr(multirange, elemalign);
+	begin = ptr = MultirangeGetBoundariesPtr(multirange, elemalign);
 	for (i = 0; i < range_count; i++)
 	{
 		uint32		len;
@@ -627,7 +627,7 @@ write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp,
 				items[i - 1] |= MULTIRANGE_ITEM_OFF_BIT;
 			prev_offset = ptr - begin;
 		}
-		flags[i] = *((Pointer) ranges[i] + VARSIZE(ranges[i]) - sizeof(char));
+		flags[i] = *((char *) ranges[i] + VARSIZE(ranges[i]) - sizeof(char));
 		len = VARSIZE(ranges[i]) - sizeof(RangeType) - sizeof(char);
 		memcpy(ptr, ranges[i] + 1, len);
 		ptr += att_align_nominal(len, elemalign);
@@ -699,8 +699,8 @@ multirange_get_range(TypeCacheEntry *rangetyp,
 {
 	uint32		offset;
 	uint8		flags;
-	Pointer		begin,
-				ptr;
+	const char *begin;
+	char	   *ptr;
 	int16		typlen = rangetyp->rngelemtype->typlen;
 	char		typalign = rangetyp->rngelemtype->typalign;
 	uint32		len;
@@ -710,7 +710,7 @@ multirange_get_range(TypeCacheEntry *rangetyp,
 
 	offset = multirange_get_bounds_offset(multirange, i);
 	flags = MultirangeGetFlagsPtr(multirange)[i];
-	ptr = begin = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
+	begin = ptr = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
 
 	/*
 	 * Calculate the size of bound values.  In principle, we could get offset
@@ -719,11 +719,11 @@ multirange_get_range(TypeCacheEntry *rangetyp,
 	 * exact size.
 	 */
 	if (RANGE_HAS_LBOUND(flags))
-		ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+		ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
 	if (RANGE_HAS_UBOUND(flags))
 	{
-		ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
-		ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+		ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
+		ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
 	}
 	len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
 
@@ -749,7 +749,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
 {
 	uint32		offset;
 	uint8		flags;
-	Pointer		ptr;
+	const char *ptr;
 	int16		typlen = rangetyp->rngelemtype->typlen;
 	char		typalign = rangetyp->rngelemtype->typalign;
 	bool		typbyval = rangetyp->rngelemtype->typbyval;
@@ -770,7 +770,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
 	{
 		/* att_align_pointer cannot be necessary here */
 		lbound = fetch_att(ptr, typbyval, typlen);
-		ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+		ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
 	}
 	else
 		lbound = (Datum) 0;
@@ -778,7 +778,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
 	/* fetch upper bound, if any */
 	if (RANGE_HAS_UBOUND(flags))
 	{
-		ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+		ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
 		ubound = fetch_att(ptr, typbyval, typlen);
 		/* no need for att_addlength_pointer */
 	}
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 065a8000cf2..b7e9f6dc0a8 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -72,8 +72,8 @@ static char *range_deparse(char flags, const char *lbound_str,
 static char *range_bound_escape(const char *value);
 static Size datum_compute_size(Size data_length, Datum val, bool typbyval,
 							   char typalign, int16 typlen, char typstorage);
-static Pointer datum_write(Pointer ptr, Datum datum, bool typbyval,
-						   char typalign, int16 typlen, char typstorage);
+static char *datum_write(char *ptr, Datum datum, bool typbyval,
+						 char typalign, int16 typlen, char typstorage);
 static Node *find_simplified_clause(PlannerInfo *root,
 									Expr *rangeExpr, Expr *elemExpr);
 static Expr *build_bound_expr(Expr *elemExpr, Datum val,
@@ -2092,7 +2092,7 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
 	int16		typlen;
 	bool		typbyval;
 	char		typalign;
-	Pointer		ptr;
+	const char *ptr;
 	Datum		lbound;
 	Datum		ubound;
 
@@ -2108,14 +2108,14 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
 	typalign = typcache->rngelemtype->typalign;
 
 	/* initialize data pointer just after the range OID */
-	ptr = (Pointer) (range + 1);
+	ptr = (char *) (range + 1);
 
 	/* fetch lower bound, if any */
 	if (RANGE_HAS_LBOUND(flags))
 	{
 		/* att_align_pointer cannot be necessary here */
 		lbound = fetch_att(ptr, typbyval, typlen);
-		ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+		ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
 	}
 	else
 		lbound = (Datum) 0;
@@ -2123,7 +2123,7 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
 	/* fetch upper bound, if any */
 	if (RANGE_HAS_UBOUND(flags))
 	{
-		ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+		ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
 		ubound = fetch_att(ptr, typbyval, typlen);
 		/* no need for att_addlength_pointer */
 	}
@@ -2937,8 +2937,8 @@ datum_compute_size(Size data_length, Datum val, bool typbyval, char typalign,
  * Write the given datum beginning at ptr (after advancing to correct
  * alignment, if needed).  Return the pointer incremented by space used.
  */
-static Pointer
-datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign,
+static char *
+datum_write(char *ptr, Datum datum, bool typbyval, char typalign,
 			int16 typlen, char typstorage)
 {
 	Size		data_length;
-- 
2.52.0