Memory leak in receivelog.c when receiving stream
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;
}
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
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