]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Skip .DS_Store files in server side utils
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 13 Feb 2024 12:47:12 +0000 (13:47 +0100)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 13 Feb 2024 12:47:12 +0000 (13:47 +0100)
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

doc/src/sgml/protocol.sgml
doc/src/sgml/ref/pg_basebackup.sgml
doc/src/sgml/ref/pg_rewind.sgml
src/backend/replication/basebackup.c
src/bin/pg_basebackup/t/010_pg_basebackup.pl
src/bin/pg_checksums/pg_checksums.c
src/bin/pg_checksums/t/002_actions.pl
src/bin/pg_rewind/filemap.c
src/bin/pg_rewind/t/003_extrafiles.pl

index 5482f1b79292f703d039c2cd953d4959cea76125..5ac937f5b6703443010566198229088fed7d24dc 100644 (file)
@@ -2795,7 +2795,7 @@ The commands accepted in replication mode are:
         <para>
          Files other than regular files and directories, such as symbolic
          links (other than for the directories listed above) and special
-         device files, are skipped.  (Symbolic links
+         device and operating system files, are skipped.  (Symbolic links
          in <filename>pg_tblspc</filename> are maintained.)
         </para>
        </listitem>
index 4e2db60b83686b8502398cab7f1dcda7c1893730..bab8c9e4806b9c1fce0e135dc8b13b41e1b2383e 100644 (file)
@@ -726,7 +726,8 @@ PostgreSQL documentation
    The backup will include all files in the data directory and tablespaces,
    including the configuration files and any additional files placed in the
    directory by third parties, except certain temporary files managed by
-   PostgreSQL.  But only regular files and directories are copied, except that
+   PostgreSQL and operating system files.  But only regular files and
+   directories are copied, except that
    symbolic links used for tablespaces are preserved.  Symbolic links pointing
    to certain directories known to PostgreSQL are copied as empty directories.
    Other symbolic links and special device files are skipped.
index 272bd113b9a00bee57a913bc9a99cbba6a2ce908..53bd04772ad43432a23fbed807bd77a99afa51af 100644 (file)
@@ -311,8 +311,9 @@ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, b
       <filename>backup_label</filename>,
       <filename>tablespace_map</filename>,
       <filename>pg_internal.init</filename>,
-      <filename>postmaster.opts</filename> and
-      <filename>postmaster.pid</filename>.
+      <filename>postmaster.opts</filename>,
+      <filename>postmaster.pid</filename> and.
+      <filename>.DS_Store</filename>.
      </para>
     </step>
     <step>
index 9e54e61441dff0d162967d8ce4f2c2d2e44d69aa..e53e7cda879241c591e63e316d936ea95cddb112 100644 (file)
@@ -1096,6 +1096,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
index d0ba2ebf9b7e823eb55205fd1c32f71b4e7ab1bc..c29ede4ca8ae576f521b26f0b8c27c3867714f00 100644 (file)
@@ -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.
@@ -140,6 +150,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');
index 2a749266adb6b1a2183bd86f3ee82a6e8254c68e..9ed53ff10e2a059973e12ef3178d343d16372038 100644 (file)
@@ -337,6 +337,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)
                {
index 29a1a2a9cb68eeb0459f5e1807586af648455d3a..3bac93f51fb0a9db988db16009d6ca59356a8fe0 100644 (file)
@@ -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");
index 72299f00ea6e32d7d7e738f5a775b3b656abe358..fe9d417c69a5407f72478b4f190c1c4ad0dd4c7a 100644 (file)
@@ -742,6 +742,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
index 5dc442f28ecd9e12bb8c618615b7bae0d01eaefa..8ca1b248a73694195e02544d8a70ac34bc10711f 100644 (file)
@@ -2,6 +2,7 @@
 
 use strict;
 use warnings;
+use Config;
 use TestLib;
 use Test::More tests => 4;
 
@@ -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",