diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index a9e926c..ed1e2cf 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -936,9 +936,23 @@ ResetDecoder(XLogReaderState *state)
 	state->decoded_record = NULL;
 
 	state->main_data_len = 0;
+	if (state->main_data)
+	{
+		pfree(state->main_data);
+		state->main_data = NULL;
+	}
 
 	for (block_id = 0; block_id <= state->max_block_id; block_id++)
 	{
+		if (state->blocks[block_id].in_use)
+		{
+			if (state->blocks[block_id].data)
+			{
+				pfree(state->blocks[block_id].data);
+				state->blocks[block_id].data = NULL;
+			}
+		}
+
 		state->blocks[block_id].in_use = false;
 		state->blocks[block_id].has_image = false;
 		state->blocks[block_id].has_data = false;
