diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 8442c5e6a7..fac9141b16 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -5272,18 +5272,14 @@ PushTransaction(void)
 		MemoryContextAllocZero(TopTransactionContext,
 							   sizeof(TransactionStateData));
 
-	/*
-	 * Assign a subtransaction ID, watching out for counter wraparound.
-	 */
-	currentSubTransactionId += 1;
-	if (currentSubTransactionId == InvalidSubTransactionId)
-	{
-		currentSubTransactionId -= 1;
-		pfree(s);
+	/* Check for overflow before incrementing the counter */
+	if (currentSubTransactionId + 1 == InvalidSubTransactionId)
 		ereport(ERROR,
 				(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
 				 errmsg("cannot have more than 2^32-1 subtransactions in a transaction")));
-	}
+
+	/* Now we can increment it without fear */
+	currentSubTransactionId += 1;
 
 	/*
 	 * We can now stack a minimally valid subtransaction without fear of
