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