Memory leak in receivelog.c when receiving stream

Started by Michael Paquieralmost 11 years ago3 messages
#1Michael Paquier
michael.paquier@gmail.com
1 attachment(s)

Hi all,

receivelog.c is leaking memory in CopyStreamReceive when receiving COPY data.
The issue has been spotted by coverity. The patch attached fixes the
problem, and contains as well improved comments.
Regards,
--
Michael

Attachments:

20150113_receivelog_leak_fix.patchtext/x-diff; charset=US-ASCII; name=20150113_receivelog_leak_fix.patchDownload
*** a/src/bin/pg_basebackup/receivelog.c
--- b/src/bin/pg_basebackup/receivelog.c
***************
*** 1035,1046 **** CopyStreamReceive(PGconn *conn, long timeout, char **buffer)
  		if (rawlen == 0)
  			return 0;
  	}
! 	if (rawlen == -1)			/* end-of-streaming or error */
  		return -2;
  	if (rawlen == -2)
  	{
  		fprintf(stderr, _("%s: could not read COPY data: %s"),
  				progname, PQerrorMessage(conn));
  		return -1;
  	}
  
--- 1035,1056 ----
  		if (rawlen == 0)
  			return 0;
  	}
! 
! 	/* end-of-streaming or error */
! 	if (rawlen == -1)
! 	{
! 		if (copybuf != NULL)
! 			PQfreemem(copybuf);
  		return -2;
+ 	}
+ 
+ 	/* failure when reading copy stream */
  	if (rawlen == -2)
  	{
  		fprintf(stderr, _("%s: could not read COPY data: %s"),
  				progname, PQerrorMessage(conn));
+ 		if (copybuf != NULL)
+ 			PQfreemem(copybuf);
  		return -1;
  	}
  
#2Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Michael Paquier (#1)
Re: Memory leak in receivelog.c when receiving stream

On 01/13/2015 10:18 AM, Michael Paquier wrote:

receivelog.c is leaking memory in CopyStreamReceive when receiving COPY data.
The issue has been spotted by coverity. The patch attached fixes the
problem, and contains as well improved comments.

*** a/src/bin/pg_basebackup/receivelog.c
--- b/src/bin/pg_basebackup/receivelog.c
***************
*** 1035,1046 **** CopyStreamReceive(PGconn *conn, long timeout, char **buffer)
if (rawlen == 0)
return 0;
}
! 	if (rawlen == -1)			/* end-of-streaming or error */
return -2;
if (rawlen == -2)
{
fprintf(stderr, _("%s: could not read COPY data: %s"),
progname, PQerrorMessage(conn));
return -1;
}
--- 1035,1056 ----
if (rawlen == 0)
return 0;
}
!
! 	/* end-of-streaming or error */
! 	if (rawlen == -1)
! 	{
! 		if (copybuf != NULL)
! 			PQfreemem(copybuf);
return -2;
+ 	}
+
+ 	/* failure when reading copy stream */
if (rawlen == -2)
{
fprintf(stderr, _("%s: could not read COPY data: %s"),
progname, PQerrorMessage(conn));
+ 		if (copybuf != NULL)
+ 			PQfreemem(copybuf);
return -1;
}

This looks like a false positive to me. PQgetCopyData() will only return
a buffer if its return value is > 0

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Michael Paquier
michael.paquier@gmail.com
In reply to: Heikki Linnakangas (#2)
Re: Memory leak in receivelog.c when receiving stream

On Tue, Jan 13, 2015 at 5:45 PM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

This looks like a false positive to me. PQgetCopyData() will only return a
buffer if its return value is > 0

Right. Sorry for the noise.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers