diff options
author | Daniel Gustafsson <dgustafsson@postgresql.org> | 2024-02-13 13:47:12 +0100 |
---|---|---|
committer | Daniel Gustafsson <dgustafsson@postgresql.org> | 2024-02-13 13:47:12 +0100 |
commit | d3fdfdcd1c7f1b714a9a85b893d2c5afc60bea91 (patch) | |
tree | 3aa364eeaff775e48f7150ecd06810e3623bf28f /src | |
parent | ceb224b62b9d66bdf8584b01c103268d3b90d577 (diff) |
Skip .DS_Store files in server side utils
The macOS Finder application creates .DS_Store files in directories
when opened, which creates problems for serverside utilities which
expect all files to be PostgreSQL specific files. Skip these files
when encountered in pg_checksums, pg_rewind and pg_basebackup.
This was extracted from a larger patchset for skipping hidden files
and system files, where the concencus was to just skip these. Since
this is equally likely to happen in every version, backpatch to all
supported versions.
Reported-by: Mark Guertin <markguertin@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: Tobias Bussmann <t.bussmann@gmx.net>
Discussion: https://postgr.es/m/E258CE50-AB0E-455D-8AAD-BB4FE8F882FB@gmail.com
Backpatch-through: v12
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/basebackup.c | 4 | ||||
-rw-r--r-- | src/bin/pg_basebackup/t/010_pg_basebackup.pl | 16 | ||||
-rw-r--r-- | src/bin/pg_checksums/pg_checksums.c | 4 | ||||
-rw-r--r-- | src/bin/pg_checksums/t/002_actions.pl | 7 | ||||
-rw-r--r-- | src/bin/pg_rewind/filemap.c | 4 | ||||
-rw-r--r-- | src/bin/pg_rewind/t/003_extrafiles.pl | 5 |
6 files changed, 40 insertions, 0 deletions
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index dcdbc1cd999..203a1387d45 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -1262,6 +1262,10 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, strlen(PG_TEMP_FILE_PREFIX)) == 0) continue; + /* Skip macOS system files */ + if (strcmp(de->d_name, ".DS_Store") == 0) + continue; + /* * Check if the postmaster has signaled us to exit, and abort with an * error in that case. The error handler further up will call diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 09c540060a4..013cf8ce46d 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -73,6 +73,16 @@ foreach my $filename ( close $file; } +# Test that macOS system files are skipped. Only test on non-macOS systems +# however since creating incorrect .DS_Store files on a macOS system may have +# unintended side effects. +if ($Config{osname} ne 'darwin') +{ + open my $file, '>>', "$pgdata/.DS_Store"; + print $file "DONOTCOPY"; + close $file; +} + # Connect to a database to create global/pg_internal.init. If this is removed # the test to ensure global/pg_internal.init is not copied will return a false # positive. @@ -141,6 +151,12 @@ foreach my $filename ( ok(!-f "$tempdir/backup/$filename", "$filename not copied"); } +# We only test .DS_Store files being skipped on non-macOS systems +if ($Config{osname} ne 'darwin') +{ + ok(!-f "$tempdir/backup/.DS_Store", ".DS_Store not copied"); +} + # Unlogged relation forks other than init should not be copied ok(-f "$tempdir/backup/${baseUnloggedPath}_init", 'unlogged init fork in backup'); diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 52e873159d1..9a15b339b74 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -338,6 +338,10 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) strlen(PG_TEMP_FILES_DIR)) == 0) continue; + /* Skip macOS system files */ + if (strcmp(de->d_name, ".DS_Store") == 0) + continue; + snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name); if (lstat(fn, &st) < 0) { diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 29a1a2a9cb6..c018a0facd9 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -3,6 +3,7 @@ use strict; use warnings; +use Config; use PostgresNode; use TestLib; use Test::More tests => 63; @@ -110,6 +111,12 @@ append_to_file "$pgdata/global/pgsql_tmp/1.1", "foo"; append_to_file "$pgdata/global/pg_internal.init", "foo"; append_to_file "$pgdata/global/pg_internal.init.123", "foo"; +# These are non-postgres macOS files, which should be ignored by the scan. +# Only perform this test on non-macOS systems though as creating incorrect +# system files may have side effects on macOS. +append_to_file "$pgdata/global/.DS_Store", "foo" + unless ($Config{osname} eq 'darwin'); + # Enable checksums. command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ], "checksums successfully enabled in cluster"); diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index fbb97b5cf1a..f818afa3ed6 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -749,6 +749,10 @@ isRelDataFile(const char *path) } } + /* Skip macOS system files */ + if (strstr(path, ".DS_Store") != NULL) + return FILE_ACTION_NONE; + /* * The sscanf tests above can match files that have extra characters at * the end. To eliminate such cases, cross-check that GetRelationPath diff --git a/src/bin/pg_rewind/t/003_extrafiles.pl b/src/bin/pg_rewind/t/003_extrafiles.pl index aa4472750a8..42c2b672b51 100644 --- a/src/bin/pg_rewind/t/003_extrafiles.pl +++ b/src/bin/pg_rewind/t/003_extrafiles.pl @@ -2,6 +2,7 @@ use strict; use warnings; +use Config; use TestLib; use Test::More tests => 5; @@ -44,6 +45,10 @@ sub run_test append_to_file "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file3", "in standby3"; + # Skip testing .DS_Store files on macOS to avoid risk of side effects + append_to_file + "$test_standby_datadir/tst_standby_dir/.DS_Store", + "macOS system file" unless ($Config{osname} eq 'darwin'); mkdir "$test_master_datadir/tst_master_dir"; append_to_file "$test_master_datadir/tst_master_dir/master_file1", |