]> granicus.if.org Git - postgresql/commitdiff
Clean up Create/DropReplicationSlot query buffer
authorStephen Frost <sfrost@snowman.net>
Mon, 6 Oct 2014 15:18:13 +0000 (11:18 -0400)
committerStephen Frost <sfrost@snowman.net>
Mon, 6 Oct 2014 15:18:13 +0000 (11:18 -0400)
CreateReplicationSlot() and DropReplicationSlot() were not cleaning up
the query buffer in some cases (mostly error conditions) which meant a
small leak.  Not generally an issue as the error case would result in an
immediate exit, but not difficult to fix either and reduces the number
of false positives from code analyzers.

In passing, also add appropriate PQclear() calls to RunIdentifySystem().

Pointed out by Coverity.

src/bin/pg_basebackup/streamutil.c

index 2f4bac95508cdc66a7be6e6b6cff66baa9e10362..d3694dab38e5be68f8b7a311a7aea9d582035389 100644 (file)
@@ -251,6 +251,8 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
        {
                fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
                                progname, "IDENTIFY_SYSTEM", PQerrorMessage(conn));
+
+               PQclear(res);
                return false;
        }
        if (PQntuples(res) != 1 || PQnfields(res) < 3)
@@ -258,6 +260,8 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
                fprintf(stderr,
                                _("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"),
                                progname, PQntuples(res), PQnfields(res), 1, 3);
+
+               PQclear(res);
                return false;
        }
 
@@ -277,6 +281,8 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
                        fprintf(stderr,
                                        _("%s: could not parse transaction log location \"%s\"\n"),
                                        progname, PQgetvalue(res, 0, 2));
+
+                       PQclear(res);
                        return false;
                }
                *startpos = ((uint64) hi) << 32 | lo;
@@ -331,6 +337,9 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
        {
                fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
                                progname, query->data, PQerrorMessage(conn));
+
+               destroyPQExpBuffer(query);
+               PQclear(res);
                return false;
        }
 
@@ -340,6 +349,9 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
                                _("%s: could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"),
                                progname, slot_name,
                                PQntuples(res), PQnfields(res), 1, 4);
+
+               destroyPQExpBuffer(query);
+               PQclear(res);
                return false;
        }
 
@@ -353,11 +365,15 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
                        fprintf(stderr,
                                        _("%s: could not parse transaction log location \"%s\"\n"),
                                        progname, PQgetvalue(res, 0, 1));
+
+                       destroyPQExpBuffer(query);
+                       PQclear(res);
                        return false;
                }
                *startpos = ((uint64) hi) << 32 | lo;
        }
 
+       destroyPQExpBuffer(query);
        PQclear(res);
        return true;
 }
@@ -384,6 +400,9 @@ DropReplicationSlot(PGconn *conn, const char *slot_name)
        {
                fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
                                progname, query->data, PQerrorMessage(conn));
+
+               destroyPQExpBuffer(query);
+               PQclear(res);
                return false;
        }
 
@@ -393,6 +412,9 @@ DropReplicationSlot(PGconn *conn, const char *slot_name)
                                _("%s: could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"),
                                progname, slot_name,
                                PQntuples(res), PQnfields(res), 0, 0);
+
+               destroyPQExpBuffer(query);
+               PQclear(res);
                return false;
        }