diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index 3a86f3497e..02c26224fc 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -165,7 +165,8 @@ allocate_recordbuf(XLogReaderState *state, uint32 reclength)
 	if (state->readRecordBuf)
 		pfree(state->readRecordBuf);
 	state->readRecordBuf =
-		(char *) palloc_extended(newSize, MCXT_ALLOC_NO_OOM);
+		(char *) palloc_extended(newSize,
+								 MCXT_ALLOC_NO_OOM | MCXT_ALLOC_NO_PARAMERR);
 	if (state->readRecordBuf == NULL)
 	{
 		state->readRecordBufSize = 0;
@@ -601,10 +602,19 @@ err:
 
 /*
  * Invalidate the xlogreader's read state to force a re-read.
+ *
+ * read state might hold too large buffer on reading invalid record so release
+ * the buffer as well.
  */
 void
 XLogReaderInvalReadState(XLogReaderState *state)
 {
+	if (state->readRecordBuf != NULL)
+	{
+		pfree(state->readRecordBuf);
+		state->readRecordBuf = NULL;
+		state->readRecordBufSize = 0;
+	}
 	state->readSegNo = 0;
 	state->readOff = 0;
 	state->readLen = 0;
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index ebe0342f18..6e7f95d11f 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -996,7 +996,12 @@ palloc_extended(Size size, int flags)
 
 	if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
 		((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
+	{
+		if (flags & MCXT_ALLOC_NO_PARAMERR)
+			return NULL;
+
 		elog(ERROR, "invalid memory alloc request size %zu", size);
+	}
 
 	context->isReset = false;
 
diff --git a/src/include/common/fe_memutils.h b/src/include/common/fe_memutils.h
index 458743dd40..5859ec087f 100644
--- a/src/include/common/fe_memutils.h
+++ b/src/include/common/fe_memutils.h
@@ -16,7 +16,8 @@
 #define MCXT_ALLOC_HUGE			0x01	/* allow huge allocation (> 1 GB) not
 										 * actually used for frontends */
 #define MCXT_ALLOC_NO_OOM		0x02	/* no failure if out-of-memory */
-#define MCXT_ALLOC_ZERO			0x04	/* zero allocated memory */
+#define MCXT_ALLOC_NO_PARAMERR	0x04	/* no failure on parameter error */
+#define MCXT_ALLOC_ZERO			0x08	/* zero allocated memory */
 
 /*
  * "Safe" memory allocation functions --- these exit(1) on failure
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index 781e948f69..eb1ecc9ee6 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -63,7 +63,8 @@ extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
  */
 #define MCXT_ALLOC_HUGE			0x01	/* allow huge allocation (> 1 GB) */
 #define MCXT_ALLOC_NO_OOM		0x02	/* no failure if out-of-memory */
-#define MCXT_ALLOC_ZERO			0x04	/* zero allocated memory */
+#define MCXT_ALLOC_NO_PARAMERR	0x04	/* no failure on parameter error */
+#define MCXT_ALLOC_ZERO			0x08	/* zero allocated memory */
 
 /*
  * Fundamental memory-allocation operations (more are in utils/memutils.h)
