diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index ca2a32bd25..e141e9d9d1 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -491,13 +491,33 @@ ginHeapTupleFastCollect(GinState *ginstate,
 	 */
 	if (collector->tuples == NULL)
 	{
-		collector->lentuples = nentries * ginstate->origTupdesc->natts;
+		/*
+		 * Determine the number of elements to allocate in the tuples array.
+		 * We'll make this a power of 2 so we don't end up with a nonsensical
+		 * number of elements when expanding the array below.
+		 */
+		collector->lentuples = 16;
+		while (collector->lentuples < nentries)
+			collector->lentuples *= 2;
+
 		collector->tuples = (IndexTuple *) palloc(sizeof(IndexTuple) * collector->lentuples);
 	}
-
-	while (collector->ntuples + nentries > collector->lentuples)
+	else if (collector->lentuples < collector->ntuples + nentries)
 	{
-		collector->lentuples *= 2;
+		/* Determine the next power of 2 for lentuples */
+		do {
+			/*
+			 * Cap at INT_MAX to prevent overflow.  The repalloc call will
+			 * fail if we hit this, so no need to raise an error here.
+			 */
+			if (collector->lentuples > INT_MAX / 2)
+			{
+				collector->lentuples = INT_MAX;
+				break;
+			}
+			collector->lentuples *= 2;
+		} while (collector->lentuples < collector->ntuples + nentries);
+
 		collector->tuples = (IndexTuple *) repalloc(collector->tuples,
 													sizeof(IndexTuple) * collector->lentuples);
 	}
