]> granicus.if.org Git - postgresql/commitdiff
Clean up pg_basebackup libpq usage
authorStephen Frost <sfrost@snowman.net>
Mon, 15 Jul 2013 15:27:20 +0000 (11:27 -0400)
committerStephen Frost <sfrost@snowman.net>
Mon, 15 Jul 2013 15:27:20 +0000 (11:27 -0400)
When using libpq, it's generally preferrable to just use the strings
which are in the PQ structures instead of copying them out, so do
that instead in BaseBackup(), eliminating the strcpy()'s used there.

Also, in ReceiveAndUnpackTarFile(), check the string length for the
directory returned by the server for the tablespace path.

src/bin/pg_basebackup/pg_basebackup.c

index d68e742920c7dc52e05d28cb200b32091c453202..f1544661c5ee8ee16ef4856586aa17eb84807780 100644 (file)
@@ -509,7 +509,15 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
        if (PQgetisnull(res, rownum, 0))
                strcpy(current_path, basedir);
        else
+       {
+               if (PQgetlength(res, rownum, 1) >= MAXPGPATH)
+               {
+                       fprintf(stderr, _("%s: received invalid directory (too long): %s"),
+                                       progname, PQgetvalue(res, rownum, 1));
+                       disconnect_and_exit(1);
+               }
                strcpy(current_path, PQgetvalue(res, rownum, 1));
+       }
 
        /*
         * Make sure we're unpacking into an empty directory
@@ -814,8 +822,6 @@ BaseBackup(void)
        char            current_path[MAXPGPATH];
        char            escaped_label[MAXPGPATH];
        int                     i;
-       char            xlogstart[64];
-       char            xlogend[64];
        int                     minServerMajor,
                                maxServerMajor;
        int                     serverMajor;
@@ -877,11 +883,9 @@ BaseBackup(void)
                                progname);
                disconnect_and_exit(1);
        }
-       strcpy(xlogstart, PQgetvalue(res, 0, 0));
        if (verbose && includewal)
-               fprintf(stderr, "xlog start point: %s\n", xlogstart);
+               fprintf(stderr, "xlog start point: %s\n", PQgetvalue(res, 0, 0));
        PQclear(res);
-       MemSet(xlogend, 0, sizeof(xlogend));
 
        /*
         * Get the header
@@ -962,9 +966,8 @@ BaseBackup(void)
                                progname);
                disconnect_and_exit(1);
        }
-       strcpy(xlogend, PQgetvalue(res, 0, 0));
        if (verbose && includewal)
-               fprintf(stderr, "xlog end point: %s\n", xlogend);
+               fprintf(stderr, "xlog end point: %s\n", PQgetvalue(res, 0, 0));
        PQclear(res);
 
        res = PQgetResult(conn);