Skip to content
Snippets Groups Projects
Commit 4318118e authored by Noah Misch's avatar Noah Misch
Browse files

Truncate strings in tarCreateHeader() with strlcpy(), not sprintf().

This supplements the GNU libc bug #6530 workarounds introduced in commit
54cd4f04.  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.
parent ad89a5d1
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,14 @@ command_fails( ...@@ -17,6 +17,14 @@ command_fails(
[ 'pg_basebackup', '-D', "$tempdir/backup" ], [ 'pg_basebackup', '-D', "$tempdir/backup" ],
'pg_basebackup fails because of hba'); '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"; open HBA, ">>$tempdir/pgdata/pg_hba.conf";
print HBA "local replication all trust\n"; print HBA "local replication all trust\n";
print HBA "host replication all 127.0.0.1/32 trust\n"; print HBA "host replication all 127.0.0.1/32 trust\n";
......
...@@ -68,7 +68,7 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, ...@@ -68,7 +68,7 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget,
memset(h, 0, 512); /* assume tar header size */ memset(h, 0, 512); /* assume tar header size */
/* Name 100 */ /* Name 100 */
sprintf(&h[0], "%.99s", filename); strlcpy(&h[0], filename, 100);
if (linktarget != NULL || S_ISDIR(mode)) if (linktarget != NULL || S_ISDIR(mode))
{ {
/* /*
...@@ -110,7 +110,7 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, ...@@ -110,7 +110,7 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget,
/* Type - Symbolic link */ /* Type - Symbolic link */
sprintf(&h[156], "2"); sprintf(&h[156], "2");
/* Link Name 100 */ /* Link Name 100 */
sprintf(&h[157], "%.99s", linktarget); strlcpy(&h[157], linktarget, 100);
} }
else if (S_ISDIR(mode)) else if (S_ISDIR(mode))
/* Type - directory */ /* Type - directory */
...@@ -127,11 +127,11 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, ...@@ -127,11 +127,11 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget,
/* User 32 */ /* User 32 */
/* XXX: Do we need to care about setting correct username? */ /* XXX: Do we need to care about setting correct username? */
sprintf(&h[265], "%.31s", "postgres"); strlcpy(&h[265], "postgres", 32);
/* Group 32 */ /* Group 32 */
/* XXX: Do we need to care about setting correct group name? */ /* XXX: Do we need to care about setting correct group name? */
sprintf(&h[297], "%.31s", "postgres"); strlcpy(&h[297], "postgres", 32);
/* Major Dev 8 */ /* Major Dev 8 */
sprintf(&h[329], "%07o ", 0); sprintf(&h[329], "%07o ", 0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment