Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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:04:53 +0000 (20:04 -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/bin/pg_basebackup/t/010_pg_basebackup.pl
src/port/tar.c

index c966de0b741aab906266829bc54a0c8606dca226..24a828bb0a332b96c2dbd1b686231935c31e1b47 100644 (file)
@@ -17,6 +17,14 @@ command_fails(
    [ 'pg_basebackup', '-D', "$tempdir/backup" ],
    'pg_basebackup fails because of hba');
 
+# Some Windows ANSI code pages may reject this filename, in which case we
+# quietly proceed without this bit of test coverage.
+if (open BADCHARS, ">>$tempdir/pgdata/FOO\xe0\xe0\xe0BAR")
+{
+   print BADCHARS "test backup of file with non-UTF8 name\n";
+   close BADCHARS;
+}
+
 open HBA, ">>$tempdir/pgdata/pg_hba.conf";
 print HBA "local replication all trust\n";
 print HBA "host replication all 127.0.0.1/32 trust\n";
index 09fd6c10d34e0c576b8fadc1dc06cd3656db5249..d664f6440b33a98567e190c441686d80e69b25b5 100644 (file)
@@ -62,7 +62,7 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget,
    memset(h, 0, 512);          /* assume tar header size */
 
    /* Name 100 */
-   sprintf(&h[0], "%.99s", filename);
+   strlcpy(&h[0], filename, 100);
    if (linktarget != NULL || S_ISDIR(mode))
    {
        /*
@@ -104,7 +104,7 @@ tarCreateHeader(char *h, 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(mode))
        /* Type - directory */
@@ -121,11 +121,11 @@ tarCreateHeader(char *h, 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);