From 65d8d9a5ac16e9afb38a409b1a7941912f9e30a0 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tristan@partin.io>
Date: Thu, 6 Aug 2026 15:51:27 +0000
Subject: [PATCH v1 2/3] Migrate array-like repalloc() calls to
 repalloc_array()

We have repalloc_array() for callers to use a type-safe version of
repalloc() that additionally does overflow checking. repalloc_array() is
the preferred way to allocate arrays/buffers.

Signed-off-by: Tristan Partin <tristan@partin.io>
---
 contrib/dict_xsyn/dict_xsyn.c                 |  2 +-
 contrib/fuzzystrmatch/dmetaphone.c            |  2 +-
 contrib/hstore/hstore_io.c                    |  4 ++--
 contrib/intarray/_int_bool.c                  |  2 +-
 contrib/ltree/lquery_op.c                     |  4 ++--
 contrib/ltree/ltxtquery_io.c                  |  4 ++--
 contrib/pg_stash_advice/stashpersist.c        |  3 +--
 .../pg_stat_statements/pg_stat_statements.c   |  2 +-
 contrib/pg_visibility/pg_visibility.c         |  3 +--
 contrib/pgcrypto/mbuf.c                       |  2 +-
 contrib/xml2/xslt_proc.c                      |  3 +--
 src/backend/access/common/reloptions.c        |  3 +--
 src/backend/access/gin/gininsert.c            |  4 ++--
 src/backend/access/gin/ginpostinglist.c       |  4 ++--
 src/backend/access/gist/gistbuildbuffers.c    | 14 +++++-------
 src/backend/access/nbtree/nbtinsert.c         |  6 ++---
 src/backend/access/nbtree/nbtpage.c           |  5 ++---
 src/backend/access/nbtree/nbtpreprocesskeys.c |  4 ++--
 src/backend/access/transam/twophase.c         |  2 +-
 src/backend/access/transam/xact.c             |  3 +--
 src/backend/access/transam/xloginsert.c       |  5 ++---
 src/backend/catalog/dependency.c              | 21 +++++++-----------
 src/backend/catalog/pg_inherits.c             |  2 +-
 src/backend/catalog/pg_shdepend.c             |  4 +---
 src/backend/commands/collationcmds.c          |  3 +--
 src/backend/commands/copyfromparse.c          |  4 ++--
 src/backend/commands/explain_state.c          |  7 +++---
 src/backend/commands/trigger.c                | 12 +++++-----
 src/backend/executor/execExpr.c               |  3 +--
 src/backend/executor/execPartition.c          | 22 +++++++++----------
 src/backend/executor/nodeIndexscan.c          | 15 ++++++-------
 src/backend/executor/nodeTidscan.c            | 12 +++-------
 src/backend/executor/spi.c                    |  4 +---
 src/backend/libpq/pqcomm.c                    |  2 +-
 src/backend/nodes/list.c                      |  3 +--
 src/backend/nodes/queryjumblefuncs.c          |  7 +++---
 src/backend/optimizer/util/extendplan.c       |  3 +--
 src/backend/optimizer/util/tlist.c            |  3 +--
 src/backend/parser/parser.c                   |  2 +-
 src/backend/parser/scan.l                     |  6 ++---
 .../replication/logical/reorderbuffer.c       |  2 +-
 src/backend/replication/logical/worker.c      |  2 +-
 src/backend/snowball/dict_snowball.c          |  2 +-
 src/backend/statistics/dependencies.c         |  5 +++--
 src/backend/storage/lmgr/lock.c               | 20 ++++++-----------
 src/backend/storage/smgr/md.c                 |  4 +---
 src/backend/tsearch/dict_thesaurus.c          |  6 ++---
 src/backend/tsearch/spell.c                   | 18 +++++++--------
 src/backend/tsearch/ts_parse.c                |  6 ++---
 src/backend/tsearch/wparser.c                 |  2 +-
 src/backend/tsearch/wparser_def.c             |  2 +-
 src/backend/utils/adt/array_userfuncs.c       | 12 +++++-----
 src/backend/utils/adt/arrayfuncs.c            | 18 ++++++---------
 src/backend/utils/adt/enum.c                  |  2 +-
 src/backend/utils/adt/format_type.c           |  2 +-
 src/backend/utils/adt/formatting.c            |  8 +++----
 src/backend/utils/adt/jsonb_util.c            |  8 +++----
 src/backend/utils/adt/jsonfuncs.c             |  3 +--
 src/backend/utils/adt/jsonpath_scan.l         |  3 ++-
 src/backend/utils/adt/multirangetypes.c       |  3 +--
 src/backend/utils/adt/pg_locale.c             |  2 +-
 src/backend/utils/adt/regexp.c                |  3 +--
 src/backend/utils/adt/tsquery.c               |  4 ++--
 src/backend/utils/adt/tsquery_cleanup.c       |  2 +-
 src/backend/utils/adt/tsrank.c                |  2 +-
 src/backend/utils/adt/tsvector.c              |  8 +++----
 src/backend/utils/adt/tsvector_parser.c       |  2 +-
 src/backend/utils/adt/varlena.c               | 10 ++++-----
 src/backend/utils/cache/inval.c               |  4 +---
 src/backend/utils/cache/relcache.c            | 13 +++++------
 src/backend/utils/cache/typcache.c            | 11 ++++------
 src/backend/utils/mb/mbutils.c                |  4 ++--
 src/backend/utils/misc/conffiles.c            |  3 +--
 src/backend/utils/misc/tzparser.c             |  2 +-
 src/backend/utils/sort/logtape.c              |  6 ++---
 src/backend/utils/sort/tuplestore.c           |  3 +--
 src/backend/utils/time/combocid.c             |  3 +--
 src/common/blkreftable.c                      | 12 ++++------
 src/common/rmtree.c                           |  3 +--
 src/common/stringinfo.c                       |  2 +-
 src/pl/plpgsql/src/pl_comp.c                  |  2 +-
 src/test/modules/test_regex/test_regex.c      |  6 ++---
 .../modules/test_tidstore/test_tidstore.c     |  6 ++---
 83 files changed, 189 insertions(+), 268 deletions(-)

diff --git a/contrib/dict_xsyn/dict_xsyn.c b/contrib/dict_xsyn/dict_xsyn.c
index b4fa3b2e524..cd77a176a6c 100644
--- a/contrib/dict_xsyn/dict_xsyn.c
+++ b/contrib/dict_xsyn/dict_xsyn.c
@@ -235,7 +235,7 @@ dxsyn_lexize(PG_FUNCTION_ARGS)
 		pos = value;
 		while ((syn = find_word(pos, &end)) != NULL)
 		{
-			res = repalloc(res, sizeof(TSLexeme) * (nsyns + 2));
+			res = repalloc_array(res, TSLexeme, nsyns + 2);
 
 			/* The first word is output only if keeporig=true */
 			if (pos != value || d->keeporig)
diff --git a/contrib/fuzzystrmatch/dmetaphone.c b/contrib/fuzzystrmatch/dmetaphone.c
index fc362dc839b..701a1fd5f3d 100644
--- a/contrib/fuzzystrmatch/dmetaphone.c
+++ b/contrib/fuzzystrmatch/dmetaphone.c
@@ -189,7 +189,7 @@ dmetaphone_alt(PG_FUNCTION_ARGS)
 		  (v = palloc_array(t, (n)))
 
 #define META_REALLOC(v,n,t) \
-					  (v = (t*)repalloc((v),((n)*sizeof(t))))
+					  (v = repalloc_array((v), t, (n)))
 
 /*
  * Don't do pfree - it seems to cause a SIGSEGV sometimes - which might have just
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index ef19b522b8e..aa8126d0b55 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -54,7 +54,7 @@ do { \
 		{ \
 				int32 clen = state->cur - state->word; \
 				state->wordlen *= 2; \
-				state->word = (char*)repalloc( (void*)state->word, state->wordlen ); \
+				state->word = repalloc_array( (void*)state->word, char, state->wordlen ); \
 				state->cur = state->word + clen; \
 		} \
 } while (0)
@@ -239,7 +239,7 @@ parse_hstore(HSParser *state)
 			if (state->pcur >= state->plen)
 			{
 				state->plen *= 2;
-				state->pairs = (Pairs *) repalloc(state->pairs, sizeof(Pairs) * state->plen);
+				state->pairs = repalloc_array(state->pairs, Pairs, state->plen);
 			}
 			if (!hstoreCheckKeyLength(state->cur - state->word, state))
 				return false;
diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c
index 4382f882939..5dc5a8bdc1f 100644
--- a/contrib/intarray/_int_bool.c
+++ b/contrib/intarray/_int_bool.c
@@ -603,7 +603,7 @@ typedef struct
 #define RESIZEBUF(inf,addsize) while( ( (inf)->cur - (inf)->buf ) + (addsize) + 1 >= (inf)->buflen ) { \
 	int32 len = inf->cur - inf->buf; \
 	inf->buflen *= 2; \
-	inf->buf = (char*) repalloc( (void*)inf->buf, inf->buflen ); \
+	inf->buf = repalloc_array( (void*)inf->buf, char, inf->buflen ); \
 	inf->cur = inf->buf + len; \
 }
 
diff --git a/contrib/ltree/lquery_op.c b/contrib/ltree/lquery_op.c
index 7bde4cbbbac..8232f40224b 100644
--- a/contrib/ltree/lquery_op.c
+++ b/contrib/ltree/lquery_op.c
@@ -110,7 +110,7 @@ ltree_label_match(const char *pred, size_t pred_len, const char *label,
 	{
 		/* grow buffer if needed and retry */
 		fpred_len = len;
-		fpred = repalloc(fpred, fpred_len + 1);
+		fpred = repalloc_array(fpred, char, fpred_len + 1);
 		len = pg_strfold(fpred, fpred_len + 1, pred, pred_len, locale);
 	}
 	Assert(len <= fpred_len);
@@ -122,7 +122,7 @@ ltree_label_match(const char *pred, size_t pred_len, const char *label,
 	{
 		/* grow buffer if needed and retry */
 		flabel_len = len;
-		flabel = repalloc(flabel, flabel_len + 1);
+		flabel = repalloc_array(flabel, char, flabel_len + 1);
 		len = pg_strfold(flabel, flabel_len + 1, label, label_len, locale);
 	}
 	Assert(len <= flabel_len);
diff --git a/contrib/ltree/ltxtquery_io.c b/contrib/ltree/ltxtquery_io.c
index f1ec8d21954..c69ae82c40a 100644
--- a/contrib/ltree/ltxtquery_io.c
+++ b/contrib/ltree/ltxtquery_io.c
@@ -195,7 +195,7 @@ pushval_asis(QPRS_STATE *state, int type, char *strval, int lenval, uint16 flag)
 		int32		tmp = state->curop - state->op;
 
 		state->lenop *= 2;
-		state->op = (char *) repalloc(state->op, state->lenop);
+		state->op = repalloc_array(state->op, char, state->lenop);
 		state->curop = state->op + tmp;
 	}
 	memcpy(state->curop, strval, lenval);
@@ -496,7 +496,7 @@ while( ( (inf)->cur - (inf)->buf ) + (addsize) + 1 >= (inf)->buflen ) \
 { \
 	int32 len = (inf)->cur - (inf)->buf; \
 	(inf)->buflen *= 2; \
-	(inf)->buf = (char*) repalloc( (void*)(inf)->buf, (inf)->buflen ); \
+	(inf)->buf = repalloc_array( (void*)(inf)->buf, char, (inf)->buflen ); \
 	(inf)->cur = (inf)->buf + len; \
 }
 
diff --git a/contrib/pg_stash_advice/stashpersist.c b/contrib/pg_stash_advice/stashpersist.c
index ee53caafc7e..ccdd13872b5 100644
--- a/contrib/pg_stash_advice/stashpersist.c
+++ b/contrib/pg_stash_advice/stashpersist.c
@@ -454,8 +454,7 @@ pgsa_read_from_disk(void)
 			if (num_entries >= max_entries)
 			{
 				max_entries *= 2;
-				entries = repalloc(entries,
-								   max_entries * sizeof(pgsa_saved_entry));
+				entries = repalloc_array(entries, pgsa_saved_entry, max_entries);
 			}
 			entries[num_entries].stash_name = stash_name;
 			entries[num_entries].queryId = queryId;
diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index d981baca741..8653ac7bdd4 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -636,7 +636,7 @@ pgss_shmem_init(void *arg)
 		if (temp.query_len >= buffer_size)
 		{
 			buffer_size = Max(buffer_size * 2, temp.query_len + 1);
-			buffer = repalloc(buffer, buffer_size);
+			buffer = repalloc_array(buffer, char, buffer_size);
 		}
 
 		if (fread(buffer, 1, temp.query_len + 1, file) != temp.query_len + 1)
diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c
index 85f6463e1f1..4292d077be1 100644
--- a/contrib/pg_visibility/pg_visibility.c
+++ b/contrib/pg_visibility/pg_visibility.c
@@ -882,8 +882,7 @@ record_corrupt_item(corrupt_items *items, ItemPointer tid)
 	if (items->next >= items->count)
 	{
 		items->count *= 2;
-		items->tids = repalloc(items->tids,
-							   items->count * sizeof(ItemPointerData));
+		items->tids = repalloc_array(items->tids, ItemPointerData, items->count);
 	}
 	/* and add the new item */
 	items->tids[items->next++] = *tid;
diff --git a/contrib/pgcrypto/mbuf.c b/contrib/pgcrypto/mbuf.c
index ce9bca74c7d..90171cb7dc8 100644
--- a/contrib/pgcrypto/mbuf.c
+++ b/contrib/pgcrypto/mbuf.c
@@ -82,7 +82,7 @@ prepare_room(MBuf *mbuf, int block_len)
 	newlen = (mbuf->buf_end - mbuf->data)
 		+ ((block_len + STEP + STEP - 1) & -STEP);
 
-	newbuf = repalloc(mbuf->data, newlen);
+	newbuf = repalloc_array(mbuf->data, uint8, newlen);
 
 	mbuf->buf_end = newbuf + newlen;
 	mbuf->data_end = newbuf + (mbuf->data_end - mbuf->data);
diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c
index 78b60b7dfea..a1e18671ce8 100644
--- a/contrib/xml2/xslt_proc.c
+++ b/contrib/xml2/xslt_proc.c
@@ -238,8 +238,7 @@ parse_params(text *paramstr)
 		if (nparams >= max_params)
 		{
 			max_params *= 2;
-			params = (const char **) repalloc(params,
-											  (max_params + 1) * sizeof(char *));
+			params = repalloc_array(params, const char *, max_params + 1);
 		}
 		params[nparams++] = pos;
 		pos = strstr(pos, nvsep);
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index aacd3e8534b..a1abfb21ec8 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -773,8 +773,7 @@ add_reloption(relopt_gen *newoption)
 		else
 		{
 			max_custom_options *= 2;
-			custom_options = repalloc(custom_options,
-									  max_custom_options * sizeof(relopt_gen *));
+			custom_options = repalloc_array(custom_options, relopt_gen *, max_custom_options);
 		}
 		MemoryContextSwitchTo(oldcxt);
 	}
diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c
index ff192ce0855..37f689a2cac 100644
--- a/src/backend/access/gin/gininsert.c
+++ b/src/backend/access/gin/gininsert.c
@@ -1529,8 +1529,8 @@ GinBufferStoreTuple(GinBuffer *buffer, GinTuple *tup)
 		if (buffer->items == NULL)
 			buffer->items = palloc_array(ItemPointerData, buffer->nitems + tup->nitems);
 		else
-			buffer->items = repalloc(buffer->items,
-									 (buffer->nitems + tup->nitems) * sizeof(ItemPointerData));
+			buffer->items = repalloc_array(buffer->items,
+										   ItemPointerData, buffer->nitems + tup->nitems);
 
 		new = ginMergeItemPointers(&buffer->items[buffer->nfrozen], /* first unfrozen */
 								   (buffer->nitems - buffer->nfrozen),	/* num of unfrozen */
diff --git a/src/backend/access/gin/ginpostinglist.c b/src/backend/access/gin/ginpostinglist.c
index 5dcda40471a..07656574029 100644
--- a/src/backend/access/gin/ginpostinglist.c
+++ b/src/backend/access/gin/ginpostinglist.c
@@ -317,7 +317,7 @@ ginPostingListDecodeAllSegments(GinPostingList *segment, int len, int *ndecoded_
 		if (ndecoded >= nallocated)
 		{
 			nallocated *= 2;
-			result = repalloc(result, nallocated * sizeof(ItemPointerData));
+			result = repalloc_array(result, ItemPointerData, nallocated);
 		}
 
 		/* copy the first item */
@@ -335,7 +335,7 @@ ginPostingListDecodeAllSegments(GinPostingList *segment, int len, int *ndecoded_
 			if (ndecoded >= nallocated)
 			{
 				nallocated *= 2;
-				result = repalloc(result, nallocated * sizeof(ItemPointerData));
+				result = repalloc_array(result, ItemPointerData, nallocated);
 			}
 
 			val += decode_varbyte(&ptr);
diff --git a/src/backend/access/gist/gistbuildbuffers.c b/src/backend/access/gist/gistbuildbuffers.c
index 3213cf45aa6..82576111b0c 100644
--- a/src/backend/access/gist/gistbuildbuffers.c
+++ b/src/backend/access/gist/gistbuildbuffers.c
@@ -142,9 +142,7 @@ gistGetNodeBuffer(GISTBuildBuffers *gfbb, GISTSTATE *giststate,
 		{
 			int			i;
 
-			gfbb->buffersOnLevels =
-				(List **) repalloc(gfbb->buffersOnLevels,
-								   (level + 1) * sizeof(List *));
+			gfbb->buffersOnLevels = repalloc_array(gfbb->buffersOnLevels, List *, level + 1);
 
 			/* initialize the enlarged portion */
 			for (i = gfbb->buffersOnLevelsLen; i <= level; i++)
@@ -203,9 +201,8 @@ gistAddLoadedBuffer(GISTBuildBuffers *gfbb, GISTNodeBuffer *nodeBuffer)
 	if (gfbb->loadedBuffersCount >= gfbb->loadedBuffersLen)
 	{
 		gfbb->loadedBuffersLen *= 2;
-		gfbb->loadedBuffers = (GISTNodeBuffer **)
-			repalloc(gfbb->loadedBuffers,
-					 gfbb->loadedBuffersLen * sizeof(GISTNodeBuffer *));
+		gfbb->loadedBuffers = repalloc_array(gfbb->loadedBuffers,
+											 GISTNodeBuffer *, gfbb->loadedBuffersLen);
 	}
 
 	gfbb->loadedBuffers[gfbb->loadedBuffersCount] = nodeBuffer;
@@ -488,9 +485,8 @@ gistBuffersReleaseBlock(GISTBuildBuffers *gfbb, long blocknum)
 	if (gfbb->nFreeBlocks >= gfbb->freeBlocksLen)
 	{
 		gfbb->freeBlocksLen *= 2;
-		gfbb->freeBlocks = (long *) repalloc(gfbb->freeBlocks,
-											 gfbb->freeBlocksLen *
-											 sizeof(long));
+		gfbb->freeBlocks = repalloc_array(gfbb->freeBlocks,
+										  long, gfbb->freeBlocksLen);
 	}
 
 	/* Add blocknum to array */
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index 35568f66eb7..3b945342d83 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -3019,8 +3019,7 @@ _bt_deadblocks(Page page, OffsetNumber *deletable, int ndeletable,
 			if (ntids + 1 > spacentids)
 			{
 				spacentids *= 2;
-				tidblocks = (BlockNumber *)
-					repalloc(tidblocks, sizeof(BlockNumber) * spacentids);
+				tidblocks = repalloc_array(tidblocks, BlockNumber, spacentids);
 			}
 
 			tidblocks[ntids++] = ItemPointerGetBlockNumber(&itup->t_tid);
@@ -3032,8 +3031,7 @@ _bt_deadblocks(Page page, OffsetNumber *deletable, int ndeletable,
 			if (ntids + nposting > spacentids)
 			{
 				spacentids = Max(spacentids * 2, ntids + nposting);
-				tidblocks = (BlockNumber *)
-					repalloc(tidblocks, sizeof(BlockNumber) * spacentids);
+				tidblocks = repalloc_array(tidblocks, BlockNumber, spacentids);
 			}
 
 			for (int j = 0; j < nposting; j++)
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 109017d6b52..ff7d2a93948 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -3120,9 +3120,8 @@ _bt_pendingfsm_add(BTVacState *vstate,
 			newbufsize = vstate->maxbufsize;
 
 		vstate->bufsize = newbufsize;
-		vstate->pendingpages =
-			repalloc(vstate->pendingpages,
-					 sizeof(BTPendingFSM) * vstate->bufsize);
+		vstate->pendingpages = repalloc_array(vstate->pendingpages,
+											  BTPendingFSM, vstate->bufsize);
 	}
 
 	/* Save metadata for newly deleted page */
diff --git a/src/backend/access/nbtree/nbtpreprocesskeys.c b/src/backend/access/nbtree/nbtpreprocesskeys.c
index 65f983ca4b8..2c911b48047 100644
--- a/src/backend/access/nbtree/nbtpreprocesskeys.c
+++ b/src/backend/access/nbtree/nbtpreprocesskeys.c
@@ -258,8 +258,8 @@ _bt_preprocess_keys(IndexScanDesc scan)
 		 * a skip array's scan key
 		 */
 		if (numberOfKeys > scan->numberOfKeys)
-			so->keyData = repalloc(so->keyData,
-								   numberOfKeys * sizeof(ScanKeyData));
+			so->keyData = repalloc_array(so->keyData,
+										 ScanKeyData, numberOfKeys);
 	}
 	else
 		inkeys = scan->keyData;
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index d088ea0ebcc..8b7f51f7463 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -2017,7 +2017,7 @@ PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p)
 				else
 				{
 					allocsize = allocsize * 2;
-					xids = repalloc(xids, allocsize * sizeof(TransactionId));
+					xids = repalloc_array(xids, TransactionId, allocsize);
 				}
 			}
 			xids[nxids++] = xid;
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 1b2b13ddbe6..5e08415e50c 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -1747,8 +1747,7 @@ AtSubCommit_childXids(void)
 				MemoryContextAlloc(TopTransactionContext,
 								   new_maxChildXids * sizeof(TransactionId));
 		else
-			new_childXids = repalloc(s->parent->childXids,
-									 new_maxChildXids * sizeof(TransactionId));
+			new_childXids = repalloc_array(s->parent->childXids, TransactionId, new_maxChildXids);
 
 		s->parent->childXids = new_childXids;
 		s->parent->maxChildXids = new_maxChildXids;
diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c
index f2e10b82b7d..c9aff944a2e 100644
--- a/src/backend/access/transam/xloginsert.c
+++ b/src/backend/access/transam/xloginsert.c
@@ -200,8 +200,7 @@ XLogEnsureRecordSpace(int max_block_id, int ndatas)
 
 	if (nbuffers > max_registered_buffers)
 	{
-		registered_buffers = (registered_buffer *)
-			repalloc(registered_buffers, sizeof(registered_buffer) * nbuffers);
+		registered_buffers = repalloc_array(registered_buffers, registered_buffer, nbuffers);
 
 		/*
 		 * At least the padding bytes in the structs must be zeroed, because
@@ -214,7 +213,7 @@ XLogEnsureRecordSpace(int max_block_id, int ndatas)
 
 	if (ndatas > max_rdatas)
 	{
-		rdatas = (XLogRecData *) repalloc(rdatas, sizeof(XLogRecData) * ndatas);
+		rdatas = repalloc_array(rdatas, XLogRecData, ndatas);
 		max_rdatas = ndatas;
 	}
 }
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c8dd78341eb..1a20ec407a2 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -971,9 +971,9 @@ findDependentObjects(const ObjectAddress *object,
 		{
 			/* enlarge array if needed */
 			maxDependentObjects *= 2;
-			dependentObjects = (ObjectAddressAndFlags *)
-				repalloc(dependentObjects,
-						 maxDependentObjects * sizeof(ObjectAddressAndFlags));
+			dependentObjects = repalloc_array(dependentObjects,
+											  ObjectAddressAndFlags,
+											  maxDependentObjects);
 		}
 
 		dependentObjects[numDependentObjects].obj = otherObject;
@@ -2737,8 +2737,7 @@ add_object_address(Oid classId, Oid objectId, int32 subId,
 	if (addrs->numrefs >= addrs->maxrefs)
 	{
 		addrs->maxrefs *= 2;
-		addrs->refs = (ObjectAddress *)
-			repalloc(addrs->refs, addrs->maxrefs * sizeof(ObjectAddress));
+		addrs->refs = repalloc_array(addrs->refs, ObjectAddress, addrs->maxrefs);
 		Assert(!addrs->extras);
 	}
 	/* record this item */
@@ -2764,8 +2763,7 @@ add_exact_object_address(const ObjectAddress *object,
 	if (addrs->numrefs >= addrs->maxrefs)
 	{
 		addrs->maxrefs *= 2;
-		addrs->refs = (ObjectAddress *)
-			repalloc(addrs->refs, addrs->maxrefs * sizeof(ObjectAddress));
+		addrs->refs = repalloc_array(addrs->refs, ObjectAddress, addrs->maxrefs);
 		Assert(!addrs->extras);
 	}
 	/* record this item */
@@ -2789,17 +2787,14 @@ add_exact_object_address_extra(const ObjectAddress *object,
 
 	/* allocate extra space if first time */
 	if (!addrs->extras)
-		addrs->extras = (ObjectAddressExtra *)
-			palloc(addrs->maxrefs * sizeof(ObjectAddressExtra));
+		addrs->extras = palloc_array(ObjectAddressExtra, addrs->maxrefs);
 
 	/* enlarge array if needed */
 	if (addrs->numrefs >= addrs->maxrefs)
 	{
 		addrs->maxrefs *= 2;
-		addrs->refs = (ObjectAddress *)
-			repalloc(addrs->refs, addrs->maxrefs * sizeof(ObjectAddress));
-		addrs->extras = (ObjectAddressExtra *)
-			repalloc(addrs->extras, addrs->maxrefs * sizeof(ObjectAddressExtra));
+		addrs->refs = repalloc_array(addrs->refs, ObjectAddress, addrs->maxrefs);
+		addrs->extras = repalloc_array(addrs->extras, ObjectAddressExtra, addrs->maxrefs);
 	}
 	/* record this item */
 	item = addrs->refs + addrs->numrefs;
diff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c
index d7a604cf750..23fb7886cfb 100644
--- a/src/backend/catalog/pg_inherits.c
+++ b/src/backend/catalog/pg_inherits.c
@@ -183,7 +183,7 @@ find_inheritance_children_extended(Oid parentrelId, bool omit_detached,
 		if (numoids >= maxoids)
 		{
 			maxoids *= 2;
-			oidarr = (Oid *) repalloc(oidarr, maxoids * sizeof(Oid));
+			oidarr = repalloc_array(oidarr, Oid, maxoids);
 		}
 		oidarr[numoids++] = inhrelid;
 	}
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index 6a8b0fc66ae..f70bffd527f 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -756,9 +756,7 @@ checkSharedDependencies(Oid classId, Oid objectId,
 			if (numobjects >= allocedobjects)
 			{
 				allocedobjects *= 2;
-				objects = (ShDependObjectInfo *)
-					repalloc(objects,
-							 allocedobjects * sizeof(ShDependObjectInfo));
+				objects = repalloc_array(objects, ShDependObjectInfo, allocedobjects);
 			}
 			objects[numobjects].object = object;
 			objects[numobjects].deptype = sdepForm->deptype;
diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c
index b6f3bc9185b..cfa0e4610d9 100644
--- a/src/backend/commands/collationcmds.c
+++ b/src/backend/commands/collationcmds.c
@@ -911,8 +911,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
 				if (naliases >= maxaliases)
 				{
 					maxaliases *= 2;
-					aliases = (CollAliasData *)
-						repalloc(aliases, maxaliases * sizeof(CollAliasData));
+					aliases = repalloc_array(aliases, CollAliasData, maxaliases);
 				}
 				aliases[naliases].localename = pstrdup(localebuf);
 				aliases[naliases].alias = pstrdup(alias);
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 500810577ad..37750cca13a 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -1879,7 +1879,7 @@ CopyReadAttributesText(CopyFromState cstate)
 		{
 			cstate->max_fields *= 2;
 			cstate->raw_fields =
-				repalloc(cstate->raw_fields, cstate->max_fields * sizeof(char *));
+				repalloc_array(cstate->raw_fields, char *, cstate->max_fields);
 		}
 
 		/* Remember start of field on both input and output sides */
@@ -2135,7 +2135,7 @@ CopyReadAttributesCSV(CopyFromState cstate)
 		{
 			cstate->max_fields *= 2;
 			cstate->raw_fields =
-				repalloc(cstate->raw_fields, cstate->max_fields * sizeof(char *));
+				repalloc_array(cstate->raw_fields, char *, cstate->max_fields);
 		}
 
 		/* Remember start of field on both input and output sides */
diff --git a/src/backend/commands/explain_state.c b/src/backend/commands/explain_state.c
index 8797a49551a..35e48bbdc37 100644
--- a/src/backend/commands/explain_state.c
+++ b/src/backend/commands/explain_state.c
@@ -251,8 +251,7 @@ GetExplainExtensionId(const char *extension_name)
 	{
 		int			i = pg_nextpower2_32(ExplainExtensionNamesAssigned + 1);
 
-		ExplainExtensionNameArray = (const char **)
-			repalloc(ExplainExtensionNameArray, i * sizeof(char *));
+		ExplainExtensionNameArray = repalloc_array(ExplainExtensionNameArray, const char *, i);
 		ExplainExtensionNamesAllocated = i;
 	}
 
@@ -366,8 +365,8 @@ RegisterExtensionExplainOption(const char *option_name,
 	{
 		int			i = pg_nextpower2_32(ExplainExtensionOptionsAssigned + 1);
 
-		ExplainExtensionOptionArray = (ExplainExtensionOption *)
-			repalloc(ExplainExtensionOptionArray, i * sizeof(ExplainExtensionOption));
+		ExplainExtensionOptionArray = repalloc_array(ExplainExtensionOptionArray,
+													 ExplainExtensionOption, i);
 		ExplainExtensionOptionsAllocated = i;
 	}
 
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1a9c0a658c1..67355147ba2 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -1931,7 +1931,7 @@ RelationBuildTriggers(Relation relation)
 		if (numtrigs >= maxtrigs)
 		{
 			maxtrigs *= 2;
-			triggers = (Trigger *) repalloc(triggers, maxtrigs * sizeof(Trigger));
+			triggers = repalloc_array(triggers, Trigger, maxtrigs);
 		}
 		build = &(triggers[numtrigs]);
 
@@ -5502,9 +5502,8 @@ AfterTriggerBeginSubXact(void)
 			/* repalloc will keep the stack in the same context */
 			int			new_alloc = afterTriggers.maxtransdepth * 2;
 
-			afterTriggers.trans_stack = (AfterTriggersTransData *)
-				repalloc(afterTriggers.trans_stack,
-						 new_alloc * sizeof(AfterTriggersTransData));
+			afterTriggers.trans_stack = repalloc_array(afterTriggers.trans_stack,
+													   AfterTriggersTransData, new_alloc);
 			afterTriggers.maxtransdepth = new_alloc;
 		}
 	}
@@ -5757,9 +5756,8 @@ AfterTriggerEnlargeQueryState(void)
 		int			new_alloc = Max(afterTriggers.query_depth + 1,
 									old_alloc * 2);
 
-		afterTriggers.query_stack = (AfterTriggersQueryData *)
-			repalloc(afterTriggers.query_stack,
-					 new_alloc * sizeof(AfterTriggersQueryData));
+		afterTriggers.query_stack = repalloc_array(afterTriggers.query_stack,
+												   AfterTriggersQueryData, new_alloc);
 		afterTriggers.maxquerydepth = new_alloc;
 	}
 
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 1322a97cc36..82e846a1f4f 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -2678,8 +2678,7 @@ ExprEvalPushStep(ExprState *es, const ExprEvalStep *s)
 	else if (es->steps_alloc == es->steps_len)
 	{
 		es->steps_alloc *= 2;
-		es->steps = repalloc(es->steps,
-							 sizeof(ExprEvalStep) * es->steps_alloc);
+		es->steps = repalloc_array(es->steps, ExprEvalStep, es->steps_alloc);
 	}
 
 	memcpy(&es->steps[es->steps_len++], s, sizeof(ExprEvalStep));
diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c
index 9b4738884af..0e938cfea1f 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -1246,12 +1246,10 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
 		else
 		{
 			proute->max_partitions *= 2;
-			proute->partitions = (ResultRelInfo **)
-				repalloc(proute->partitions, sizeof(ResultRelInfo *) *
-						 proute->max_partitions);
-			proute->is_borrowed_rel = (bool *)
-				repalloc(proute->is_borrowed_rel, sizeof(bool) *
-						 proute->max_partitions);
+			proute->partitions = repalloc_array(proute->partitions,
+												ResultRelInfo *, proute->max_partitions);
+			proute->is_borrowed_rel = repalloc_array(proute->is_borrowed_rel,
+													 bool, proute->max_partitions);
 		}
 	}
 
@@ -1362,12 +1360,12 @@ ExecInitPartitionDispatchInfo(EState *estate,
 		else
 		{
 			proute->max_dispatch *= 2;
-			proute->partition_dispatch_info = (PartitionDispatch *)
-				repalloc(proute->partition_dispatch_info,
-						 sizeof(PartitionDispatch) * proute->max_dispatch);
-			proute->nonleaf_partitions = (ResultRelInfo **)
-				repalloc(proute->nonleaf_partitions,
-						 sizeof(ResultRelInfo *) * proute->max_dispatch);
+			proute->partition_dispatch_info = repalloc_array(proute->partition_dispatch_info,
+															 PartitionDispatch,
+															 proute->max_dispatch);
+			proute->nonleaf_partitions = repalloc_array(proute->nonleaf_partitions,
+														ResultRelInfo *,
+														proute->max_dispatch);
 		}
 	}
 	proute->partition_dispatch_info[dispatchidx] = pd;
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 8143fcf2581..1897d860497 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -1285,8 +1285,8 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index,
 					else
 					{
 						max_runtime_keys *= 2;
-						runtime_keys = (IndexRuntimeKeyInfo *)
-							repalloc(runtime_keys, max_runtime_keys * sizeof(IndexRuntimeKeyInfo));
+						runtime_keys = repalloc_array(runtime_keys,
+													  IndexRuntimeKeyInfo, max_runtime_keys);
 					}
 				}
 				runtime_keys[n_runtime_keys].scan_key = this_scan_key;
@@ -1407,8 +1407,8 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index,
 						else
 						{
 							max_runtime_keys *= 2;
-							runtime_keys = (IndexRuntimeKeyInfo *)
-								repalloc(runtime_keys, max_runtime_keys * sizeof(IndexRuntimeKeyInfo));
+							runtime_keys = repalloc_array(runtime_keys,
+														  IndexRuntimeKeyInfo, max_runtime_keys);
 						}
 					}
 					runtime_keys[n_runtime_keys].scan_key = this_sub_key;
@@ -1519,14 +1519,13 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index,
 						if (max_runtime_keys == 0)
 						{
 							max_runtime_keys = 8;
-							runtime_keys = (IndexRuntimeKeyInfo *)
-								palloc(max_runtime_keys * sizeof(IndexRuntimeKeyInfo));
+							runtime_keys = palloc_array(IndexRuntimeKeyInfo, max_runtime_keys);
 						}
 						else
 						{
 							max_runtime_keys *= 2;
-							runtime_keys = (IndexRuntimeKeyInfo *)
-								repalloc(runtime_keys, max_runtime_keys * sizeof(IndexRuntimeKeyInfo));
+							runtime_keys = repalloc_array(runtime_keys,
+														  IndexRuntimeKeyInfo, max_runtime_keys);
 						}
 					}
 					runtime_keys[n_runtime_keys].scan_key = this_scan_key;
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 19e55b85f64..b63329de330 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -188,9 +188,7 @@ TidListEval(TidScanState *tidstate)
 			if (numTids >= numAllocTids)
 			{
 				numAllocTids *= 2;
-				tidList = (ItemPointerData *)
-					repalloc(tidList,
-							 numAllocTids * sizeof(ItemPointerData));
+				tidList = repalloc_array(tidList, ItemPointerData, numAllocTids);
 			}
 			tidList[numTids++] = *itemptr;
 		}
@@ -213,9 +211,7 @@ TidListEval(TidScanState *tidstate)
 			if (numTids + ndatums > numAllocTids)
 			{
 				numAllocTids = numTids + ndatums;
-				tidList = (ItemPointerData *)
-					repalloc(tidList,
-							 numAllocTids * sizeof(ItemPointerData));
+				tidList = repalloc_array(tidList, ItemPointerData, numAllocTids);
 			}
 			for (i = 0; i < ndatums; i++)
 			{
@@ -244,9 +240,7 @@ TidListEval(TidScanState *tidstate)
 				if (numTids >= numAllocTids)
 				{
 					numAllocTids *= 2;
-					tidList = (ItemPointerData *)
-						repalloc(tidList,
-								 numAllocTids * sizeof(ItemPointerData));
+					tidList = repalloc_array(tidList, ItemPointerData, numAllocTids);
 				}
 				tidList[numTids++] = cursor_tid;
 			}
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 23a8395766c..196b998dd7f 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -120,9 +120,7 @@ SPI_connect_ext(int options)
 		if (_SPI_stack_depth == _SPI_connected + 1)
 		{
 			newdepth = _SPI_stack_depth * 2;
-			_SPI_stack = (_SPI_connection *)
-				repalloc(_SPI_stack,
-						 newdepth * sizeof(_SPI_connection));
+			_SPI_stack = repalloc_array(_SPI_stack, _SPI_connection, newdepth);
 			_SPI_stack_depth = newdepth;
 		}
 	}
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index aaae7214f13..481b24d6460 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -1534,7 +1534,7 @@ socket_putmessage_noblock(char msgtype, const char *s, size_t len)
 	required = PqSendPointer + 1 + 4 + len;
 	if (required > PqSendBufferSize)
 	{
-		PqSendBuffer = repalloc(PqSendBuffer, required);
+		PqSendBuffer = repalloc_array(PqSendBuffer, char, required);
 		PqSendBufferSize = required;
 	}
 	res = socket_putmessage(msgtype, s, len);
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index 98fc2b44b50..51de24eb460 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -206,8 +206,7 @@ enlarge_list(List *list, int min_size)
 	{
 #ifndef DEBUG_LIST_MEMORY_USAGE
 		/* Normally, let repalloc deal with enlargement */
-		list->elements = (ListCell *) repalloc(list->elements,
-											   new_max_len * sizeof(ListCell));
+		list->elements = repalloc_array(list->elements, ListCell, new_max_len);
 #else
 		/*
 		 * repalloc() might enlarge the space in-place, which we don't want
diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c
index 15cf9862cf7..8d2f7988b15 100644
--- a/src/backend/nodes/queryjumblefuncs.c
+++ b/src/backend/nodes/queryjumblefuncs.c
@@ -405,10 +405,9 @@ RecordConstLocation(JumbleState *jstate, bool extern_param, int location, int le
 		if (jstate->clocations_count >= jstate->clocations_buf_size)
 		{
 			jstate->clocations_buf_size *= 2;
-			jstate->clocations = (LocationLen *)
-				repalloc(jstate->clocations,
-						 jstate->clocations_buf_size *
-						 sizeof(LocationLen));
+			jstate->clocations = repalloc_array(jstate->clocations,
+												LocationLen,
+												jstate->clocations_buf_size);
 		}
 		jstate->clocations[jstate->clocations_count].location = location;
 
diff --git a/src/backend/optimizer/util/extendplan.c b/src/backend/optimizer/util/extendplan.c
index 40f37f0c8de..e2d077b7b02 100644
--- a/src/backend/optimizer/util/extendplan.c
+++ b/src/backend/optimizer/util/extendplan.c
@@ -60,8 +60,7 @@ GetPlannerExtensionId(const char *extension_name)
 	{
 		int			i = pg_nextpower2_32(PlannerExtensionNamesAssigned + 1);
 
-		PlannerExtensionNameArray = (const char **)
-			repalloc(PlannerExtensionNameArray, i * sizeof(char *));
+		PlannerExtensionNameArray = repalloc_array(PlannerExtensionNameArray, const char *, i);
 		PlannerExtensionNamesAllocated = i;
 	}
 
diff --git a/src/backend/optimizer/util/tlist.c b/src/backend/optimizer/util/tlist.c
index 3bef96acb54..ae652f25e14 100644
--- a/src/backend/optimizer/util/tlist.c
+++ b/src/backend/optimizer/util/tlist.c
@@ -711,8 +711,7 @@ add_column_to_pathtarget(PathTarget *target, Expr *expr, Index sortgroupref)
 		int			nexprs = list_length(target->exprs);
 
 		/* This might look inefficient, but actually it's usually cheap */
-		target->sortgrouprefs = (Index *)
-			repalloc(target->sortgrouprefs, nexprs * sizeof(Index));
+		target->sortgrouprefs = repalloc_array(target->sortgrouprefs, Index, nexprs);
 		target->sortgrouprefs[nexprs - 1] = sortgroupref;
 	}
 	else if (sortgroupref)
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index 5ec345f08f6..6d273d9e18f 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -396,7 +396,7 @@ str_udeescape(const char *str, char escape,
 		if (out_dist > new_len - (MAX_UNICODE_EQUIVALENT_STRING + 1))
 		{
 			new_len *= 2;
-			new = repalloc(new, new_len);
+			new = repalloc_array(new, char, new_len);
 			out = new + out_dist;
 		}
 
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index b7d0d7c2ff9..a9c6ec0d913 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -1296,8 +1296,7 @@ addlit(char *ytext, int yleng, core_yyscan_t yyscanner)
 	if ((yyextra->literallen + yleng) >= yyextra->literalalloc)
 	{
 		yyextra->literalalloc = pg_nextpower2_32(yyextra->literallen + yleng + 1);
-		yyextra->literalbuf = (char *) repalloc(yyextra->literalbuf,
-												yyextra->literalalloc);
+		yyextra->literalbuf = repalloc_array(yyextra->literalbuf, char, yyextra->literalalloc);
 	}
 	/* append new data */
 	memcpy(yyextra->literalbuf + yyextra->literallen, ytext, yleng);
@@ -1312,8 +1311,7 @@ addlitchar(unsigned char ychar, core_yyscan_t yyscanner)
 	if ((yyextra->literallen + 1) >= yyextra->literalalloc)
 	{
 		yyextra->literalalloc *= 2;
-		yyextra->literalbuf = (char *) repalloc(yyextra->literalbuf,
-												yyextra->literalalloc);
+		yyextra->literalbuf = repalloc_array(yyextra->literalbuf, char, yyextra->literalalloc);
 	}
 	/* append new data */
 	yyextra->literalbuf[yyextra->literallen] = ychar;
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 6aed6346366..fb8c71e3836 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -3797,7 +3797,7 @@ ReorderBufferSerializeReserve(ReorderBuffer *rb, Size sz)
 	}
 	else if (rb->outbufsize < sz)
 	{
-		rb->outbuf = repalloc(rb->outbuf, sz);
+		rb->outbuf = repalloc_array(rb->outbuf, char, sz);
 		rb->outbufsize = sz;
 	}
 }
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 8a31bcc16a0..818d1c17e2e 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -2355,7 +2355,7 @@ apply_spooled_messages(FileSet *stream_fileset, TransactionId xid,
 				 len, path);
 
 		/* make sure we have sufficiently large buffer */
-		buffer = repalloc(buffer, len);
+		buffer = repalloc_array(buffer, char, len);
 
 		/* and finally read the data into the buffer */
 		BufFileReadExact(stream_fd, buffer, len);
diff --git a/src/backend/snowball/dict_snowball.c b/src/backend/snowball/dict_snowball.c
index 182bd156995..c91daa8ae04 100644
--- a/src/backend/snowball/dict_snowball.c
+++ b/src/backend/snowball/dict_snowball.c
@@ -337,7 +337,7 @@ dsnowball_lexize(PG_FUNCTION_ARGS)
 
 		if (d->z->p && d->z->l)
 		{
-			txt = repalloc(txt, d->z->l + 1);
+			txt = repalloc_array(txt, char, d->z->l + 1);
 			memcpy(txt, d->z->p, d->z->l);
 			txt[d->z->l] = '\0';
 		}
diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c
index 628526ebff6..81bcf76cc1c 100644
--- a/src/backend/statistics/dependencies.c
+++ b/src/backend/statistics/dependencies.c
@@ -136,8 +136,9 @@ generate_dependencies_recurse(DependencyGenerator state, int index,
 			 */
 			if (!match)
 			{
-				state->dependencies = (AttrNumber *) repalloc(state->dependencies,
-															  state->k * (state->ndependencies + 1) * sizeof(AttrNumber));
+				state->dependencies = repalloc_array(state->dependencies,
+													 AttrNumber,
+													 state->k * (state->ndependencies + 1));
 				memcpy(&state->dependencies[(state->k * state->ndependencies)],
 					   current, state->k * sizeof(AttrNumber));
 				state->ndependencies++;
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 4178a1f7cf7..11dd90b6a3e 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -917,9 +917,8 @@ LockAcquireExtended(const LOCKTAG *locktag,
 		{
 			int			newsize = locallock->maxLockOwners * 2;
 
-			locallock->lockOwners = (LOCALLOCKOWNER *)
-				repalloc(locallock->lockOwners,
-						 newsize * sizeof(LOCALLOCKOWNER));
+			locallock->lockOwners = repalloc_array(locallock->lockOwners,
+												   LOCALLOCKOWNER, newsize);
 			locallock->maxLockOwners = newsize;
 		}
 	}
@@ -3828,8 +3827,7 @@ GetLockStatusData(void)
 				if (el >= els)
 				{
 					els += MaxBackends;
-					data->locks = (LockInstanceData *)
-						repalloc(data->locks, sizeof(LockInstanceData) * els);
+					data->locks = repalloc_array(data->locks, LockInstanceData, els);
 				}
 
 				instance = &data->locks[el];
@@ -3861,8 +3859,7 @@ GetLockStatusData(void)
 			if (el >= els)
 			{
 				els += MaxBackends;
-				data->locks = (LockInstanceData *)
-					repalloc(data->locks, sizeof(LockInstanceData) * els);
+				data->locks = repalloc_array(data->locks, LockInstanceData, els);
 			}
 
 			vxid.procNumber = proc->vxid.procNumber;
@@ -3906,8 +3903,7 @@ GetLockStatusData(void)
 	if (data->nelements > els)
 	{
 		els = data->nelements;
-		data->locks = (LockInstanceData *)
-			repalloc(data->locks, sizeof(LockInstanceData) * els);
+		data->locks = repalloc_array(data->locks, LockInstanceData, els);
 	}
 
 	/* Now scan the tables to copy the data */
@@ -4090,8 +4086,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data)
 		if (data->nlocks >= data->maxlocks)
 		{
 			data->maxlocks += MaxBackends;
-			data->locks = (LockInstanceData *)
-				repalloc(data->locks, sizeof(LockInstanceData) * data->maxlocks);
+			data->locks = repalloc_array(data->locks, LockInstanceData, data->maxlocks);
 		}
 
 		instance = &data->locks[data->nlocks];
@@ -4117,8 +4112,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data)
 	{
 		data->maxpids = Max(data->maxpids + MaxBackends,
 							data->npids + queue_size);
-		data->waiter_pids = (int *) repalloc(data->waiter_pids,
-											 sizeof(int) * data->maxpids);
+		data->waiter_pids = repalloc_array(data->waiter_pids, int, data->maxpids);
 	}
 
 	/* Collect PIDs from the lock's wait queue, stopping at blocked_proc */
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 9f96d9cbbfc..780c88c0630 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -1668,9 +1668,7 @@ _fdvec_resize(SMgrRelation reln,
 		 * FileClose(), and the memory context internally will sometimes avoid
 		 * doing an actual reallocation.
 		 */
-		reln->md_seg_fds[forknum] =
-			repalloc(reln->md_seg_fds[forknum],
-					 sizeof(MdfdVec) * nseg);
+		reln->md_seg_fds[forknum] = repalloc_array(reln->md_seg_fds[forknum], MdfdVec, nseg);
 	}
 	else
 	{
diff --git a/src/backend/tsearch/dict_thesaurus.c b/src/backend/tsearch/dict_thesaurus.c
index 0fd4cf3dfa8..c4c223133a5 100644
--- a/src/backend/tsearch/dict_thesaurus.c
+++ b/src/backend/tsearch/dict_thesaurus.c
@@ -306,7 +306,7 @@ addCompiledLexeme(TheLexeme *newwrds, int *nnw, int *tnm, TSLexeme *lexeme, Lexe
 	if (*nnw >= *tnm)
 	{
 		*tnm *= 2;
-		newwrds = (TheLexeme *) repalloc(newwrds, sizeof(TheLexeme) * *tnm);
+		newwrds = repalloc_array(newwrds, TheLexeme, *tnm);
 	}
 
 	newwrds[*nnw].entries = palloc_object(LexemeInfo);
@@ -495,7 +495,7 @@ compileTheLexeme(DictThesaurus *d)
 		}
 
 		d->nwrds = newwrds - d->wrds + 1;
-		d->wrds = (TheLexeme *) repalloc(d->wrds, sizeof(TheLexeme) * d->nwrds);
+		d->wrds = repalloc_array(d->wrds, TheLexeme, d->nwrds);
 	}
 }
 
@@ -547,7 +547,7 @@ compileTheSubstitute(DictThesaurus *d)
 						int			diff = outptr - d->subst[i].res;
 
 						n *= 2;
-						d->subst[i].res = (TSLexeme *) repalloc(d->subst[i].res, sizeof(TSLexeme) * n);
+						d->subst[i].res = repalloc_array(d->subst[i].res, TSLexeme, n);
 						outptr = d->subst[i].res + diff;
 					}
 
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 11f2ed1a182..7501c36a69c 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -493,7 +493,7 @@ NIAddSpell(IspellDict *Conf, const char *word, const char *flag)
 		if (Conf->mspell)
 		{
 			Conf->mspell *= 2;
-			Conf->Spell = (SPELL **) repalloc(Conf->Spell, Conf->mspell * sizeof(SPELL *));
+			Conf->Spell = repalloc_array(Conf->Spell, SPELL *, Conf->mspell);
 		}
 		else
 		{
@@ -687,7 +687,7 @@ NIAddAffix(IspellDict *Conf, const char *flag, char flagflags, const char *mask,
 		if (Conf->maffixes)
 		{
 			Conf->maffixes *= 2;
-			Conf->Affix = (AFFIX *) repalloc(Conf->Affix, Conf->maffixes * sizeof(AFFIX));
+			Conf->Affix = repalloc_array(Conf->Affix, AFFIX, Conf->maffixes);
 		}
 		else
 		{
@@ -1106,9 +1106,9 @@ addCompoundAffixFlagValue(IspellDict *Conf, const char *s, uint32 val)
 		if (Conf->mCompoundAffixFlag)
 		{
 			Conf->mCompoundAffixFlag *= 2;
-			Conf->CompoundAffixFlags = (CompoundAffixFlag *)
-				repalloc(Conf->CompoundAffixFlags,
-						 Conf->mCompoundAffixFlag * sizeof(CompoundAffixFlag));
+			Conf->CompoundAffixFlags = repalloc_array(Conf->CompoundAffixFlags,
+													  CompoundAffixFlag,
+													  Conf->mCompoundAffixFlag);
 		}
 		else
 		{
@@ -1611,8 +1611,7 @@ MergeAffix(IspellDict *Conf, int a1, int a2)
 	if (Conf->nAffixData + 1 >= Conf->lenAffixData)
 	{
 		Conf->lenAffixData *= 2;
-		Conf->AffixData = (const char **) repalloc(Conf->AffixData,
-												   sizeof(char *) * Conf->lenAffixData);
+		Conf->AffixData = repalloc_array(Conf->AffixData, const char *, Conf->lenAffixData);
 	}
 
 	ptr = Conf->AffixData + Conf->nAffixData;
@@ -2042,7 +2041,8 @@ NISortAffixes(IspellDict *Conf)
 		}
 	}
 	ptr->affix = NULL;
-	Conf->CompoundAffix = (CMPDAffix *) repalloc(Conf->CompoundAffix, sizeof(CMPDAffix) * (ptr - Conf->CompoundAffix + 1));
+	Conf->CompoundAffix = repalloc_array(Conf->CompoundAffix,
+										 CMPDAffix, ptr - Conf->CompoundAffix + 1);
 
 	/* Start build a prefix tree */
 	Conf->Prefix = mkANode(Conf, 0, firstsuffix, 0, FF_PREFIX);
@@ -2425,7 +2425,7 @@ AddStem(SplitVar *v, char *word)
 	if (v->nstem >= v->lenstem)
 	{
 		v->lenstem *= 2;
-		v->stem = (char **) repalloc(v->stem, sizeof(char *) * v->lenstem);
+		v->stem = repalloc_array(v->stem, char *, v->lenstem);
 	}
 
 	v->stem[v->nstem] = word;
diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c
index bee84e10053..7e535b46b34 100644
--- a/src/backend/tsearch/ts_parse.c
+++ b/src/backend/tsearch/ts_parse.c
@@ -410,7 +410,7 @@ parsetext(Oid cfgId, ParsedText *prs, char *buf, int buflen)
 				if (prs->curwords == prs->lenwords)
 				{
 					prs->lenwords *= 2;
-					prs->words = (ParsedWord *) repalloc(prs->words, prs->lenwords * sizeof(ParsedWord));
+					prs->words = repalloc_array(prs->words, ParsedWord, prs->lenwords);
 				}
 
 				if (ptr->flags & TSL_ADDPOS)
@@ -442,7 +442,7 @@ hladdword(HeadlineParsedText *prs, char *buf, int buflen, int type)
 	if (prs->curwords >= prs->lenwords)
 	{
 		prs->lenwords *= 2;
-		prs->words = (HeadlineWordEntry *) repalloc(prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
+		prs->words = repalloc_array(prs->words, HeadlineWordEntry, prs->lenwords);
 	}
 	memset(&(prs->words[prs->curwords]), 0, sizeof(HeadlineWordEntry));
 	prs->words[prs->curwords].type = (uint8) type;
@@ -470,7 +470,7 @@ hlfinditem(HeadlineParsedText *prs, TSQuery query, int32 pos, char *buf, int buf
 	while (prs->curwords + query->size >= prs->lenwords)
 	{
 		prs->lenwords *= 2;
-		prs->words = (HeadlineWordEntry *) repalloc(prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
+		prs->words = repalloc_array(prs->words, HeadlineWordEntry, prs->lenwords);
 	}
 
 	word = &(prs->words[prs->curwords - 1]);
diff --git a/src/backend/tsearch/wparser.c b/src/backend/tsearch/wparser.c
index 8a782b66030..50c1887bdf6 100644
--- a/src/backend/tsearch/wparser.c
+++ b/src/backend/tsearch/wparser.c
@@ -190,7 +190,7 @@ prs_setup_firstcall(FuncCallContext *funcctx, FunctionCallInfo fcinfo,
 		if (st->cur >= st->len)
 		{
 			st->len = 2 * st->len;
-			st->list = (LexemeEntry *) repalloc(st->list, sizeof(LexemeEntry) * st->len);
+			st->list = repalloc_array(st->list, LexemeEntry, st->len);
 		}
 		st->list[st->cur].lexeme = palloc(llen + 1);
 		memcpy(st->list[st->cur].lexeme, lex, llen);
diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c
index d798d4fb9e7..f1ed8a71c52 100644
--- a/src/backend/tsearch/wparser_def.c
+++ b/src/backend/tsearch/wparser_def.c
@@ -2273,7 +2273,7 @@ mark_hl_fragments(HeadlineParsedText *prs, TSQuery query, List *locations,
 			if (numcovers >= maxcovers)
 			{
 				maxcovers *= 2;
-				covers = repalloc(covers, sizeof(CoverPos) * maxcovers);
+				covers = repalloc_array(covers, CoverPos, maxcovers);
 			}
 			covers[numcovers].startpos = startpos;
 			covers[numcovers].endpos = endpos;
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
index d81ef83fa7c..702c6be1695 100644
--- a/src/backend/utils/adt/array_userfuncs.c
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -662,10 +662,8 @@ array_agg_combine(PG_FUNCTION_ARGS)
 		{
 			/* Use a power of 2 size rather than allocating just reqsize */
 			state1->alen = pg_nextpower2_32(reqsize);
-			state1->dvalues = (Datum *) repalloc(state1->dvalues,
-												 state1->alen * sizeof(Datum));
-			state1->dnulls = (bool *) repalloc(state1->dnulls,
-											   state1->alen * sizeof(bool));
+			state1->dvalues = repalloc_array(state1->dvalues, Datum, state1->alen);
+			state1->dnulls = repalloc_array(state1->dnulls, bool, state1->alen);
 		}
 
 		/* Copy in the state2 elements to the end of the state1 arrays */
@@ -1083,7 +1081,7 @@ array_agg_array_combine(PG_FUNCTION_ARGS)
 		{
 			/* use a power of 2 size rather than allocating just reqsize */
 			state1->abytes = pg_nextpower2_32(reqsize);
-			state1->data = (char *) repalloc(state1->data, state1->abytes);
+			state1->data = repalloc_array(state1->data, char, state1->abytes);
 		}
 
 		/* Combine the null bitmaps, if present. */
@@ -1104,8 +1102,8 @@ array_agg_array_combine(PG_FUNCTION_ARGS)
 			else if (newnitems > state1->aitems)
 			{
 				state1->aitems = pg_nextpower2_32(newnitems);
-				state1->nullbitmap = (uint8 *)
-					repalloc(state1->nullbitmap, (state1->aitems + 7) / 8);
+				state1->nullbitmap = repalloc_array(state1->nullbitmap,
+													uint8, (state1->aitems + 7) / 8);
 			}
 			/* This will do the right thing if state2->nullbitmap is NULL: */
 			array_bitmap_copy(state1->nullbitmap, state1->nitems,
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 47141a7c4c8..49c4fd0e84e 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -2676,11 +2676,9 @@ array_set_element_expanded(Datum arraydatum,
 		int			newlen = dim[0] + dim[0] / 8;
 
 		newlen = Max(newlen, dim[0]);	/* integer overflow guard */
-		eah->dvalues = dvalues = (Datum *)
-			repalloc(dvalues, newlen * sizeof(Datum));
+		eah->dvalues = dvalues = repalloc_array(dvalues, Datum, newlen);
 		if (dnulls)
-			eah->dnulls = dnulls = (bool *)
-				repalloc(dnulls, newlen * sizeof(bool));
+			eah->dnulls = dnulls = repalloc_array(dnulls, bool, newlen);
 		eah->dvalueslen = newlen;
 	}
 
@@ -5389,10 +5387,8 @@ accumArrayResult(ArrayBuildState *astate,
 					(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
 					 errmsg("array size exceeds the maximum allowed (%zu)",
 							MaxAllocSize)));
-		astate->dvalues = (Datum *)
-			repalloc(astate->dvalues, astate->alen * sizeof(Datum));
-		astate->dnulls = (bool *)
-			repalloc(astate->dnulls, astate->alen * sizeof(bool));
+		astate->dvalues = repalloc_array(astate->dvalues, Datum, astate->alen);
+		astate->dnulls = repalloc_array(astate->dnulls, bool, astate->alen);
 	}
 
 	/*
@@ -5661,7 +5657,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
 		{
 			astate->abytes = Max(astate->abytes * 2,
 								 astate->nbytes + ndatabytes);
-			astate->data = (char *) repalloc(astate->data, astate->abytes);
+			astate->data = repalloc_array(astate->data, char, astate->abytes);
 		}
 	}
 
@@ -5692,8 +5688,8 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
 		else if (newnitems > astate->aitems)
 		{
 			astate->aitems = Max(astate->aitems * 2, newnitems);
-			astate->nullbitmap = (uint8 *)
-				repalloc(astate->nullbitmap, (astate->aitems + 7) / 8);
+			astate->nullbitmap = repalloc_array(astate->nullbitmap,
+												uint8, (astate->aitems + 7) / 8);
 		}
 		array_bitmap_copy(astate->nullbitmap, astate->nitems,
 						  ARR_NULLBITMAP(arg), 0,
diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c
index 5d6a3af9172..9b87373e0e9 100644
--- a/src/backend/utils/adt/enum.c
+++ b/src/backend/utils/adt/enum.c
@@ -591,7 +591,7 @@ enum_range_internal(Oid enumtypoid, Oid lower, Oid upper)
 			if (cnt >= max)
 			{
 				max *= 2;
-				elems = (Datum *) repalloc(elems, max * sizeof(Datum));
+				elems = repalloc_array(elems, Datum, max);
 			}
 
 			elems[cnt++] = ObjectIdGetDatum(enum_oid);
diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c
index 366e54fd1ca..51e58efb086 100644
--- a/src/backend/utils/adt/format_type.c
+++ b/src/backend/utils/adt/format_type.c
@@ -471,7 +471,7 @@ oidvectortypes(PG_FUNCTION_ARGS)
 		if (left < (slen + 2))
 		{
 			total += slen + 2;
-			result = repalloc(result, total);
+			result = repalloc_array(result, char, total);
 			left += slen + 2;
 		}
 
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 462e36e4887..3fd5474c350 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1663,7 +1663,7 @@ str_tolower(const char *buff, size_t nbytes, Oid collid)
 		{
 			/* grow buffer if needed and retry */
 			dstsize = needed + 1;
-			dst = repalloc(dst, dstsize);
+			dst = repalloc_array(dst, char, dstsize);
 			needed = pg_strlower(dst, dstsize, src, srclen, mylocale);
 			Assert(needed + 1 <= dstsize);
 		}
@@ -1727,7 +1727,7 @@ str_toupper(const char *buff, size_t nbytes, Oid collid)
 		{
 			/* grow buffer if needed and retry */
 			dstsize = needed + 1;
-			dst = repalloc(dst, dstsize);
+			dst = repalloc_array(dst, char, dstsize);
 			needed = pg_strupper(dst, dstsize, src, srclen, mylocale);
 			Assert(needed + 1 <= dstsize);
 		}
@@ -1791,7 +1791,7 @@ str_initcap(const char *buff, size_t nbytes, Oid collid)
 		{
 			/* grow buffer if needed and retry */
 			dstsize = needed + 1;
-			dst = repalloc(dst, dstsize);
+			dst = repalloc_array(dst, char, dstsize);
 			needed = pg_strtitle(dst, dstsize, src, srclen, mylocale);
 			Assert(needed + 1 <= dstsize);
 		}
@@ -1860,7 +1860,7 @@ str_casefold(const char *buff, size_t nbytes, Oid collid)
 		{
 			/* grow buffer if needed and retry */
 			dstsize = needed + 1;
-			dst = repalloc(dst, dstsize);
+			dst = repalloc_array(dst, char, dstsize);
 			needed = pg_strfold(dst, dstsize, src, srclen, mylocale);
 			Assert(needed + 1 <= dstsize);
 		}
diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c
index 91fb9ea09bf..b23facb6dac 100644
--- a/src/backend/utils/adt/jsonb_util.c
+++ b/src/backend/utils/adt/jsonb_util.c
@@ -799,8 +799,8 @@ appendKey(JsonbInState *pstate, JsonbValue *string, bool needCopy)
 					 errmsg("number of jsonb object pairs exceeds the maximum allowed (%zu)",
 							JSONB_MAX_PAIRS)));
 		ppstate->size = Min(ppstate->size * 2, JSONB_MAX_PAIRS);
-		object->val.object.pairs = repalloc(object->val.object.pairs,
-											sizeof(JsonbPair) * ppstate->size);
+		object->val.object.pairs = repalloc_array(object->val.object.pairs,
+												  JsonbPair, ppstate->size);
 	}
 
 	pair = &object->val.object.pairs[object->val.object.nPairs];
@@ -850,8 +850,8 @@ appendElement(JsonbInState *pstate, JsonbValue *scalarVal, bool needCopy)
 					 errmsg("number of jsonb array elements exceeds the maximum allowed (%zu)",
 							JSONB_MAX_ELEMS)));
 		ppstate->size = Min(ppstate->size * 2, JSONB_MAX_ELEMS);
-		array->val.array.elems = repalloc(array->val.array.elems,
-										  sizeof(JsonbValue) * ppstate->size);
+		array->val.array.elems = repalloc_array(array->val.array.elems,
+												JsonbValue, ppstate->size);
 	}
 
 	elem = &array->val.array.elems[array->val.array.nElems];
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index a1fa55fa2dd..bc7b556e22e 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -798,8 +798,7 @@ okeys_object_field_start(void *state, char *fname, bool isnull)
 	if (_state->result_count >= _state->result_size)
 	{
 		_state->result_size *= 2;
-		_state->result = (char **)
-			repalloc(_state->result, sizeof(char *) * _state->result_size);
+		_state->result = repalloc_array(_state->result, char *, _state->result_size);
 	}
 
 	/* save a copy of the field name */
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
index 50017587ecb..a6e238b8700 100644
--- a/src/backend/utils/adt/jsonpath_scan.l
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -507,7 +507,8 @@ resizeString(bool init, int appendLen, yyscan_t yyscanner)
 		{
 			while (yyextra->scanstring.len + appendLen >= yyextra->scanstring.total)
 				yyextra->scanstring.total *= 2;
-			yyextra->scanstring.val = repalloc(yyextra->scanstring.val, yyextra->scanstring.total);
+			yyextra->scanstring.val = repalloc_array(yyextra->scanstring.val,
+													 char, yyextra->scanstring.total);
 		}
 	}
 }
diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
index ccb9ba2b644..e72a2efadcd 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -201,8 +201,7 @@ multirange_in(PG_FUNCTION_ARGS)
 					if (range_capacity == range_count)
 					{
 						range_capacity *= 2;
-						ranges = (RangeType **)
-							repalloc(ranges, range_capacity * sizeof(RangeType *));
+						ranges = repalloc_array(ranges, RangeType *, range_capacity);
 					}
 					ranges_seen++;
 					if (!InputFunctionCallSafe(&cache->typioproc,
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index fb69320d2c9..9f433ea79b2 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -1754,7 +1754,7 @@ icu_language_tag(const char *loc_str, int elevel)
 			buflen < MaxAllocSize)
 		{
 			buflen = Min(buflen * 2, MaxAllocSize);
-			langtag = repalloc(langtag, buflen);
+			langtag = repalloc_array(langtag, char, buflen);
 			continue;
 		}
 
diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c
index 371e5af28f1..488608e044b 100644
--- a/src/backend/utils/adt/regexp.c
+++ b/src/backend/utils/adt/regexp.c
@@ -1570,8 +1570,7 @@ setup_regexp_matches(text *orig_str, text *pattern, pg_re_flags *re_flags,
 					ereport(ERROR,
 							(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
 							 errmsg("too many regular expression matches")));
-				matchctx->match_locs = (int *) repalloc(matchctx->match_locs,
-														sizeof(int) * array_len);
+				matchctx->match_locs = repalloc_array(matchctx->match_locs, int, array_len);
 			}
 
 			/* save this match's locations */
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index c9797f632d1..5eac6adf1b2 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -598,7 +598,7 @@ pushValue(TSQueryParserState state, char *strval, int lenval, int16 weight, bool
 		int			used = state->curop - state->op;
 
 		state->lenop *= 2;
-		state->op = (char *) repalloc(state->op, state->lenop);
+		state->op = repalloc_array(state->op, char, state->lenop);
 		state->curop = state->op + used;
 	}
 	memcpy(state->curop, strval, lenval);
@@ -979,7 +979,7 @@ while( ( (inf)->cur - (inf)->buf ) + (addsize) + 1 >= (inf)->buflen ) \
 { \
 	int len = (inf)->cur - (inf)->buf; \
 	(inf)->buflen *= 2; \
-	(inf)->buf = (char*) repalloc( (void*)(inf)->buf, (inf)->buflen ); \
+	(inf)->buf = repalloc_array( (void*)(inf)->buf, char, (inf)->buflen ); \
 	(inf)->cur = (inf)->buf + len; \
 }
 
diff --git a/src/backend/utils/adt/tsquery_cleanup.c b/src/backend/utils/adt/tsquery_cleanup.c
index 79c3e6ef1d0..1ec3316169e 100644
--- a/src/backend/utils/adt/tsquery_cleanup.c
+++ b/src/backend/utils/adt/tsquery_cleanup.c
@@ -67,7 +67,7 @@ plainnode(PLAINTREE *state, NODE *node)
 	if (state->cur == state->len)
 	{
 		state->len *= 2;
-		state->ptr = (QueryItem *) repalloc(state->ptr, state->len * sizeof(QueryItem));
+		state->ptr = repalloc_array(state->ptr, QueryItem, state->len);
 	}
 	memcpy(&(state->ptr[state->cur]), node->valnode, sizeof(QueryItem));
 	if (node->valnode->type == QI_VAL)
diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c
index 3012ad437af..bd1c478e370 100644
--- a/src/backend/utils/adt/tsrank.c
+++ b/src/backend/utils/adt/tsrank.c
@@ -803,7 +803,7 @@ get_docrep(TSVector txt, QueryRepresentation *qr, int *doclen)
 			while (cur + dimt >= len)
 			{
 				len *= 2;
-				doc = (DocRepresentation *) repalloc(doc, sizeof(DocRepresentation) * len);
+				doc = repalloc_array(doc, DocRepresentation, len);
 			}
 
 			/* iterations over entry's positions */
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
index 84e2a70297f..7117334a9f4 100644
--- a/src/backend/utils/adt/tsvector.c
+++ b/src/backend/utils/adt/tsvector.c
@@ -139,8 +139,7 @@ uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen)
 				/* append ptr's positions to res's positions */
 				int			newlen = ptr->poslen + res->poslen;
 
-				res->pos = (WordEntryPos *)
-					repalloc(res->pos, newlen * sizeof(WordEntryPos));
+				res->pos = repalloc_array(res->pos, WordEntryPos, newlen);
 				memcpy(&res->pos[res->poslen], ptr->pos,
 					   ptr->poslen * sizeof(WordEntryPos));
 				res->poslen = newlen;
@@ -226,15 +225,14 @@ tsvectorin(PG_FUNCTION_ARGS)
 		if (len >= arrlen)
 		{
 			arrlen *= 2;
-			arr = (WordEntryIN *)
-				repalloc(arr, sizeof(WordEntryIN) * arrlen);
+			arr = repalloc_array(arr, WordEntryIN, arrlen);
 		}
 		while ((cur - tmpbuf) + toklen >= buflen)
 		{
 			int			dist = cur - tmpbuf;
 
 			buflen *= 2;
-			tmpbuf = (char *) repalloc(tmpbuf, buflen);
+			tmpbuf = repalloc_array(tmpbuf, char, buflen);
 			cur = tmpbuf + dist;
 		}
 		arr[len].entry.len = toklen;
diff --git a/src/backend/utils/adt/tsvector_parser.c b/src/backend/utils/adt/tsvector_parser.c
index d7d12236b0e..b69a0a301e6 100644
--- a/src/backend/utils/adt/tsvector_parser.c
+++ b/src/backend/utils/adt/tsvector_parser.c
@@ -100,7 +100,7 @@ do { \
 	if ( clen + state->eml >= state->len ) \
 	{ \
 		state->len *= 2; \
-		state->word = (char *) repalloc(state->word, state->len); \
+		state->word = repalloc_array(state->word, char, state->len); \
 		curpos = state->word + clen; \
 	} \
 } while (0)
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index 305ecd3f59c..e3eba0b24d9 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -1967,12 +1967,12 @@ varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup)
 	if (len1 >= sss->buflen1)
 	{
 		sss->buflen1 = Max(len1 + 1, Min(sss->buflen1 * 2, MaxAllocSize));
-		sss->buf1 = repalloc(sss->buf1, sss->buflen1);
+		sss->buf1 = repalloc_array(sss->buf1, char, sss->buflen1);
 	}
 	if (len2 >= sss->buflen2)
 	{
 		sss->buflen2 = Max(len2 + 1, Min(sss->buflen2 * 2, MaxAllocSize));
-		sss->buf2 = repalloc(sss->buf2, sss->buflen2);
+		sss->buf2 = repalloc_array(sss->buf2, char, sss->buflen2);
 	}
 
 	/*
@@ -2074,7 +2074,7 @@ varstr_abbrev_convert(Datum original, SortSupport ssup)
 		if (len >= sss->buflen1)
 		{
 			sss->buflen1 = Max(len + 1, Min(sss->buflen1 * 2, MaxAllocSize));
-			sss->buf1 = repalloc(sss->buf1, sss->buflen1);
+			sss->buf1 = repalloc_array(sss->buf1, char, sss->buflen1);
 		}
 
 		/* Might be able to reuse strxfrm() blob from last call */
@@ -2100,7 +2100,7 @@ varstr_abbrev_convert(Datum original, SortSupport ssup)
 			{
 				sss->buflen2 = Max(max_prefix_bytes,
 								   Min(sss->buflen2 * 2, MaxAllocSize));
-				sss->buf2 = repalloc(sss->buf2, sss->buflen2);
+				sss->buf2 = repalloc_array(sss->buf2, char, sss->buflen2);
 			}
 
 			bsize = pg_strxfrm_prefix(sss->buf2, sss->buf1,
@@ -2130,7 +2130,7 @@ varstr_abbrev_convert(Datum original, SortSupport ssup)
 				 */
 				sss->buflen2 = Max(bsize + 1,
 								   Min(sss->buflen2 * 2, MaxAllocSize));
-				sss->buf2 = repalloc(sss->buf2, sss->buflen2);
+				sss->buf2 = repalloc_array(sss->buf2, char, sss->buflen2);
 			}
 		}
 
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c
index b41692dc7d1..3820232c664 100644
--- a/src/backend/utils/cache/inval.c
+++ b/src/backend/utils/cache/inval.c
@@ -341,9 +341,7 @@ AddInvalidationMessage(InvalidationMsgsGroup *group, int subgroup,
 			/* Enlarge storage array */
 			int			reqsize = 2 * ima->maxmsgs;
 
-			ima->msgs = (SharedInvalidationMessage *)
-				repalloc(ima->msgs,
-						 reqsize * sizeof(SharedInvalidationMessage));
+			ima->msgs = repalloc_array(ima->msgs, SharedInvalidationMessage, reqsize);
 			ima->maxmsgs = reqsize;
 		}
 	}
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index c34ca4feee5..188de2ee504 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -881,8 +881,7 @@ RelationBuildRuleLock(Relation relation)
 		if (numlocks >= maxlocks)
 		{
 			maxlocks *= 2;
-			rules = (RewriteRule **)
-				repalloc(rules, sizeof(RewriteRule *) * maxlocks);
+			rules = repalloc_array(rules, RewriteRule *, maxlocks);
 		}
 		rules[numlocks++] = rule;
 	}
@@ -1098,8 +1097,7 @@ RelationBuildDesc(Oid targetRelId, bool insertIt)
 		int			allocsize;
 
 		allocsize = in_progress_list_maxlen * 2;
-		in_progress_list = repalloc(in_progress_list,
-									allocsize * sizeof(*in_progress_list));
+		in_progress_list = repalloc_array(in_progress_list, InProgressEnt, allocsize);
 		in_progress_list_maxlen = allocsize;
 	}
 	in_progress_offset = in_progress_list_len++;
@@ -3124,8 +3122,7 @@ RememberToFreeTupleDescAtEOX(TupleDesc td)
 
 		Assert(EOXactTupleDescArrayLen > 0);
 
-		EOXactTupleDescArray = (TupleDesc *) repalloc(EOXactTupleDescArray,
-													  newlen * sizeof(TupleDesc));
+		EOXactTupleDescArray = repalloc_array(EOXactTupleDescArray, TupleDesc, newlen);
 		EOXactTupleDescArrayLen = newlen;
 	}
 
@@ -3195,7 +3192,7 @@ AssertPendingSyncs_RelationCache(void)
 		if (nrels >= maxrels)
 		{
 			maxrels *= 2;
-			rels = repalloc(rels, maxrels * sizeof(*rels));
+			rels = repalloc_array(rels, Relation, maxrels);
 		}
 		rels[nrels++] = r;
 	}
@@ -6264,7 +6261,7 @@ load_relcache_init_file(bool shared)
 		if (num_rels >= max_rels)
 		{
 			max_rels *= 2;
-			rels = (Relation *) repalloc(rels, max_rels * sizeof(Relation));
+			rels = repalloc_array(rels, Relation, max_rels);
 		}
 
 		rel = rels[num_rels++] = (Relation) palloc(len);
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 00133ba92ef..eca2d73231a 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -455,8 +455,7 @@ lookup_type_cache(Oid type_id, int flags)
 		int			allocsize;
 
 		allocsize = in_progress_list_maxlen * 2;
-		in_progress_list = repalloc(in_progress_list,
-									allocsize * sizeof(*in_progress_list));
+		in_progress_list = repalloc_array(in_progress_list, Oid, allocsize);
 		in_progress_list_maxlen = allocsize;
 	}
 
@@ -1236,14 +1235,12 @@ load_domaintype_info(TypeCacheEntry *typentry)
 			if (ccons == NULL)
 			{
 				cconslen = 8;
-				ccons = (DomainConstraintState **)
-					palloc(cconslen * sizeof(DomainConstraintState *));
+				ccons = palloc_array(DomainConstraintState *, cconslen);
 			}
 			else if (nccons >= cconslen)
 			{
 				cconslen *= 2;
-				ccons = (DomainConstraintState **)
-					repalloc(ccons, cconslen * sizeof(DomainConstraintState *));
+				ccons = repalloc_array(ccons, DomainConstraintState *, cconslen);
 			}
 			ccons[nccons++] = r;
 		}
@@ -2828,7 +2825,7 @@ load_enum_cache_data(TypeCacheEntry *tcache)
 		if (numitems >= maxitems)
 		{
 			maxitems *= 2;
-			items = (EnumItem *) repalloc(items, sizeof(EnumItem) * maxitems);
+			items = repalloc_array(items, EnumItem, maxitems);
 		}
 		items[numitems].enum_oid = en->oid;
 		items[numitems].sort_order = en->enumsortorder;
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index e4f29c2b1c9..27abe134a2a 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -439,7 +439,7 @@ pg_do_encoding_conversion(unsigned char *src, int len,
 					 errdetail("String of %d bytes is too long for encoding conversion.",
 							   len)));
 
-		result = (unsigned char *) repalloc(result, resultlen + 1);
+		result = repalloc_array(result, unsigned char, resultlen + 1);
 	}
 
 	return result;
@@ -853,7 +853,7 @@ perform_default_encoding_conversion(const char *src, int len,
 					 errdetail("String of %d bytes is too long for encoding conversion.",
 							   len)));
 
-		result = (char *) repalloc(result, resultlen + 1);
+		result = repalloc_array(result, char, resultlen + 1);
 	}
 
 	return result;
diff --git a/src/backend/utils/misc/conffiles.c b/src/backend/utils/misc/conffiles.c
index 3148aa2cc19..c77ff4d38d4 100644
--- a/src/backend/utils/misc/conffiles.c
+++ b/src/backend/utils/misc/conffiles.c
@@ -144,8 +144,7 @@ GetConfFilesInDir(const char *includedir, const char *calling_file,
 			if (*num_filenames >= size_filenames)
 			{
 				size_filenames += 32;
-				filenames = (char **) repalloc(filenames,
-											   size_filenames * sizeof(char *));
+				filenames = repalloc_array(filenames, char *, size_filenames);
 			}
 			filenames[*num_filenames] = pstrdup(filename);
 			(*num_filenames)++;
diff --git a/src/backend/utils/misc/tzparser.c b/src/backend/utils/misc/tzparser.c
index 8129cf44c4f..ace982cf8d7 100644
--- a/src/backend/utils/misc/tzparser.c
+++ b/src/backend/utils/misc/tzparser.c
@@ -250,7 +250,7 @@ addToArray(tzEntry **base, int *arraysize, int n,
 	if (n >= *arraysize)
 	{
 		*arraysize *= 2;
-		*base = (tzEntry *) repalloc(*base, *arraysize * sizeof(tzEntry));
+		*base = repalloc_array(*base, tzEntry, *arraysize);
 	}
 
 	arrayptr = *base + low;
diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c
index 2e8fab35e7b..5daec060078 100644
--- a/src/backend/utils/sort/logtape.c
+++ b/src/backend/utils/sort/logtape.c
@@ -445,8 +445,7 @@ ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt)
 		lt->prealloc_size *= 2;
 		if (lt->prealloc_size > TAPE_WRITE_PREALLOC_MAX)
 			lt->prealloc_size = TAPE_WRITE_PREALLOC_MAX;
-		lt->prealloc = (int64 *) repalloc(lt->prealloc,
-										  sizeof(int64) * lt->prealloc_size);
+		lt->prealloc = repalloc_array(lt->prealloc, int64, lt->prealloc_size);
 	}
 
 	/* refill preallocation list */
@@ -490,8 +489,7 @@ ltsReleaseBlock(LogicalTapeSet *lts, int64 blocknum)
 			return;
 
 		lts->freeBlocksLen *= 2;
-		lts->freeBlocks = (int64 *) repalloc(lts->freeBlocks,
-											 lts->freeBlocksLen * sizeof(int64));
+		lts->freeBlocks = repalloc_array(lts->freeBlocks, int64, lts->freeBlocksLen);
 	}
 
 	/* create a "hole" at end of minheap array */
diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c
index fc8adeef18c..35e438ceaa6 100644
--- a/src/backend/utils/sort/tuplestore.c
+++ b/src/backend/utils/sort/tuplestore.c
@@ -406,8 +406,7 @@ tuplestore_alloc_read_pointer(Tuplestorestate *state, int eflags)
 	{
 		int			newcnt = state->readptrsize * 2;
 
-		state->readptrs = (TSReadPointer *)
-			repalloc(state->readptrs, newcnt * sizeof(TSReadPointer));
+		state->readptrs = repalloc_array(state->readptrs, TSReadPointer, newcnt);
 		state->readptrsize = newcnt;
 	}
 
diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c
index 614b7c1006b..5113cf809ba 100644
--- a/src/backend/utils/time/combocid.c
+++ b/src/backend/utils/time/combocid.c
@@ -242,8 +242,7 @@ GetComboCommandId(CommandId cmin, CommandId cmax)
 	{
 		int			newsize = sizeComboCids * 2;
 
-		comboCids = (ComboCidKeyData *)
-			repalloc(comboCids, sizeof(ComboCidKeyData) * newsize);
+		comboCids = repalloc_array(comboCids, ComboCidKeyData, newsize);
 		sizeComboCids = newsize;
 	}
 
diff --git a/src/common/blkreftable.c b/src/common/blkreftable.c
index 9e0db8a5433..3dce09beb70 100644
--- a/src/common/blkreftable.c
+++ b/src/common/blkreftable.c
@@ -1039,16 +1039,13 @@ BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry,
 		}
 		else
 		{
-			entry->chunk_size = repalloc(entry->chunk_size,
-										 sizeof(uint16) * max_chunks);
+			entry->chunk_size = repalloc_array(entry->chunk_size, uint16, max_chunks);
 			memset(&entry->chunk_size[entry->nchunks], 0,
 				   extra_chunks * sizeof(uint16));
-			entry->chunk_usage = repalloc(entry->chunk_usage,
-										  sizeof(uint16) * max_chunks);
+			entry->chunk_usage = repalloc_array(entry->chunk_usage, uint16, max_chunks);
 			memset(&entry->chunk_usage[entry->nchunks], 0,
 				   extra_chunks * sizeof(uint16));
-			entry->chunk_data = repalloc(entry->chunk_data,
-										 sizeof(BlockRefTableChunk) * max_chunks);
+			entry->chunk_data = repalloc_array(entry->chunk_data, BlockRefTableChunk, max_chunks);
 			memset(&entry->chunk_data[entry->nchunks], 0,
 				   extra_chunks * sizeof(BlockRefTableChunk));
 		}
@@ -1138,8 +1135,7 @@ BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry,
 		unsigned	newsize = entry->chunk_size[chunkno] * 2;
 
 		Assert(newsize <= MAX_ENTRIES_PER_CHUNK);
-		entry->chunk_data[chunkno] = repalloc(entry->chunk_data[chunkno],
-											  newsize * sizeof(uint16));
+		entry->chunk_data[chunkno] = repalloc_array(entry->chunk_data[chunkno], uint16, newsize);
 		entry->chunk_size[chunkno] = newsize;
 	}
 
diff --git a/src/common/rmtree.c b/src/common/rmtree.c
index e35b5e7ba73..86560417123 100644
--- a/src/common/rmtree.c
+++ b/src/common/rmtree.c
@@ -85,8 +85,7 @@ rmtree(const char *path, bool rmtopdir)
 				 */
 				if (dirnames_size == dirnames_capacity)
 				{
-					dirnames = repalloc(dirnames,
-										sizeof(char *) * dirnames_capacity * 2);
+					dirnames = repalloc_array(dirnames, char *, dirnames_capacity * 2);
 					dirnames_capacity *= 2;
 				}
 				dirnames[dirnames_size++] = pstrdup(pathbuf);
diff --git a/src/common/stringinfo.c b/src/common/stringinfo.c
index e2b16d5e308..169df1d9ea6 100644
--- a/src/common/stringinfo.c
+++ b/src/common/stringinfo.c
@@ -394,7 +394,7 @@ enlargeStringInfo(StringInfo str, int needed)
 	if (newlen > (int) MaxAllocSize)
 		newlen = (int) MaxAllocSize;
 
-	str->data = (char *) repalloc(str->data, newlen);
+	str->data = repalloc_array(str->data, char, newlen);
 
 	str->maxlen = newlen;
 }
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index b72c963b3be..75184b75707 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -2242,7 +2242,7 @@ plpgsql_adddatum(PLpgSQL_datum *newdatum)
 	if (plpgsql_nDatums == datums_alloc)
 	{
 		datums_alloc *= 2;
-		plpgsql_Datums = repalloc(plpgsql_Datums, sizeof(PLpgSQL_datum *) * datums_alloc);
+		plpgsql_Datums = repalloc_array(plpgsql_Datums, PLpgSQL_datum *, datums_alloc);
 	}
 
 	newdatum->dno = plpgsql_nDatums;
diff --git a/src/test/modules/test_regex/test_regex.c b/src/test/modules/test_regex/test_regex.c
index 918c52c00b0..561f79c9460 100644
--- a/src/test/modules/test_regex/test_regex.c
+++ b/src/test/modules/test_regex/test_regex.c
@@ -503,8 +503,7 @@ setup_test_matches(text *orig_str,
 				ereport(ERROR,
 						(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
 						 errmsg("too many regular expression matches")));
-			matchctx->match_locs = (int *) repalloc(matchctx->match_locs,
-													sizeof(int) * array_len);
+			matchctx->match_locs = repalloc_array(matchctx->match_locs, int, array_len);
 		}
 
 		/* save this match's locations */
@@ -552,8 +551,7 @@ setup_test_matches(text *orig_str,
 				ereport(ERROR,
 						(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
 						 errmsg("too many regular expression matches")));
-			matchctx->match_locs = (int *) repalloc(matchctx->match_locs,
-													sizeof(int) * array_len);
+			matchctx->match_locs = repalloc_array(matchctx->match_locs, int, array_len);
 		}
 
 		matchctx->match_locs[array_idx++] = matchctx->details.rm_extend.rm_so;
diff --git a/src/test/modules/test_tidstore/test_tidstore.c b/src/test/modules/test_tidstore/test_tidstore.c
index 86200e99860..0793cfa374a 100644
--- a/src/test/modules/test_tidstore/test_tidstore.c
+++ b/src/test/modules/test_tidstore/test_tidstore.c
@@ -212,9 +212,9 @@ do_set_block_offsets(PG_FUNCTION_ARGS)
 		if (idx >= items.max_tids)
 		{
 			items.max_tids *= 2;
-			items.insert_tids = repalloc(items.insert_tids, sizeof(ItemPointerData) * items.max_tids);
-			items.lookup_tids = repalloc(items.lookup_tids, sizeof(ItemPointerData) * items.max_tids);
-			items.iter_tids = repalloc(items.iter_tids, sizeof(ItemPointerData) * items.max_tids);
+			items.insert_tids = repalloc_array(items.insert_tids, ItemPointerData, items.max_tids);
+			items.lookup_tids = repalloc_array(items.lookup_tids, ItemPointerData, items.max_tids);
+			items.iter_tids = repalloc_array(items.iter_tids, ItemPointerData, items.max_tids);
 		}
 
 		tid = &(items.insert_tids[idx]);
-- 
Tristan Partin
https://tristan.partin.io

