diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index d252f9b78967f0933009709999045dbfe46117ae..6f2634bb641e3f2b8d3e29d107a75eb92a1dad05 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -1288,7 +1288,7 @@ readMessageFromPipe(int fd)
 
 		/* worker has closed the connection or another error happened */
 		if (ret <= 0)
-			return NULL;
+			break;
 
 		Assert(ret == 1);
 
@@ -1303,6 +1303,14 @@ readMessageFromPipe(int fd)
 			msg = (char *) realloc(msg, bufsize);
 		}
 	}
+
+	/*
+	 * Worker has closed the connection, make sure to clean up before return
+	 * since we are not returning msg (but did allocate it).
+	 */
+	free(msg);
+
+	return NULL;
 }
 
 #ifdef WIN32