]> 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/backup/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 fdd3d0514831bd8cf92b4b622d5d48a536413719..ea314d279ac8e77db5e83bb9664887581483806e 100644 (file)
@@ -3062,7 +3062,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
          <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 a5f63bd6609e2d902cb7543095ec6b7e4b50af77..04323af0b35723e7523b086eddc91b47535447ca 100644 (file)
@@ -905,7 +905,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 69d6924b3a23648a8969d4847bd4b85d10d0c6be..dffb1b12f72e1dea2ebca08a009a8634025a8525 100644 (file)
@@ -389,8 +389,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>, as well as any file or directory
+      <filename>postmaster.opts</filename>,
+      <filename>postmaster.pid</filename> and
+      <filename>.DS_Store</filename> as well as any file or directory
       beginning with <filename>pgsql_tmp</filename>, are omitted.
      </para>
     </step>
index 078a3fe99c26220b0b8fd3cb7e47d5b81d38e428..847a52f599b35eae9eb4f166fadf28581384f034 100644 (file)
@@ -1185,6 +1185,10 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly,
                                        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 ec72282aae5ee36524cda381f00feaca84453fdc..e0f34e16f92caec72f7abcd9f8dc7c3f4b31eb44 100644 (file)
@@ -3,6 +3,7 @@
 
 use strict;
 use warnings;
+use Config;
 use File::Basename qw(basename dirname);
 use File::Path qw(rmtree);
 use PostgreSQL::Test::Cluster;
@@ -173,6 +174,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.
@@ -242,6 +253,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 21dfe1b6ee5c560fea32ca1ea751ccba9b22b3cd..1af65cd2de8350c8ee23fb55752b66b58d0b8f4a 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)
                        pg_fatal("could not stat file \"%s\": %m", fn);
index 0309cbbaa330fdd673940618a12743b230a57338..792ac4823d32ed526677d3a143d13c472a471148 100644 (file)
@@ -6,6 +6,7 @@
 
 use strict;
 use warnings;
+use Config;
 use PostgreSQL::Test::Cluster;
 use PostgreSQL::Test::Utils;
 
@@ -114,6 +115,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 62529310415504a92468fd37817ea52280826942..24f508c6efa016e8754c1c21b23c9b3cbdb5de5b 100644 (file)
@@ -647,6 +647,10 @@ decide_file_action(file_entry_t *entry)
        if (strcmp(path, "global/pg_control") == 0)
                return FILE_ACTION_NONE;
 
+       /* Skip macOS system files */
+       if (strstr(path, ".DS_Store") != NULL)
+               return FILE_ACTION_NONE;
+
        /*
         * Remove all files matching the exclusion filters in the target.
         */
index 100c212a4db33c3908188fb4eb01edb663c5e207..54bb63ccec20f28675773e1ca4630194da3cce82 100644 (file)
@@ -5,6 +5,7 @@
 
 use strict;
 use warnings;
+use Config;
 use PostgreSQL::Test::Utils;
 use Test::More;
 
@@ -53,6 +54,10 @@ sub run_test
        append_to_file
          "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file4",
          "in standby4";
+       # 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_primary_datadir/tst_primary_dir";
        append_to_file "$test_primary_datadir/tst_primary_dir/primary_file1",