]> granicus.if.org Git - postgresql/commitdiff
Truncate strings in tarCreateHeader() with strlcpy(), not sprintf().
authorNoah Misch <noah@leadboat.com>
Mon, 22 Jun 2015 00:04:36 +0000 (20:04 -0400)
committerNoah Misch <noah@leadboat.com>
Mon, 22 Jun 2015 00:05:27 +0000 (20:05 -0400)
This supplements the GNU libc bug #6530 workarounds introduced in commit
54cd4f04576833abc394e131288bf3dd7dcf4806.  On affected systems, a
tar-format pg_basebackup failed when some filename beneath the data
directory was not valid character data in the postmaster/walsender
locale.  Back-patch to 9.1, where pg_basebackup was introduced.  Extant,
bug-prone conversion specifications receive only ASCII bytes or involve
low-importance messages.

src/backend/replication/basebackup.c

index 896ab6917a6d925789ae0d61ac2ddfa65aca3f64..0e5f070bdfc90ad5c5a9d63966cdec188578a9ea 100644 (file)
@@ -1159,7 +1159,7 @@ _tarWriteHeader(const char *filename, const char *linktarget,
        memset(h, 0, sizeof(h));
 
        /* Name 100 */
-       sprintf(&h[0], "%.99s", filename);
+       strlcpy(&h[0], filename, 100);
        if (linktarget != NULL || S_ISDIR(statbuf->st_mode))
        {
                /*
@@ -1201,7 +1201,7 @@ _tarWriteHeader(const char *filename, const char *linktarget,
                /* Type - Symbolic link */
                sprintf(&h[156], "2");
                /* Link Name 100 */
-               sprintf(&h[157], "%.99s", linktarget);
+               strlcpy(&h[157], linktarget, 100);
        }
        else if (S_ISDIR(statbuf->st_mode))
                /* Type - directory */
@@ -1218,11 +1218,11 @@ _tarWriteHeader(const char *filename, const char *linktarget,
 
        /* User 32 */
        /* XXX: Do we need to care about setting correct username? */
-       sprintf(&h[265], "%.31s", "postgres");
+       strlcpy(&h[265], "postgres", 32);
 
        /* Group 32 */
        /* XXX: Do we need to care about setting correct group name? */
-       sprintf(&h[297], "%.31s", "postgres");
+       strlcpy(&h[297], "postgres", 32);
 
        /* Major Dev 8 */
        sprintf(&h[329], "%07o ", 0);