diff --git a/src/bin/pg_verify_checksums/pg_verify_checksums.c b/src/bin/pg_verify_checksums/pg_verify_checksums.c index f0e09bea20..1bc020ab6c 100644 --- a/src/bin/pg_verify_checksums/pg_verify_checksums.c +++ b/src/bin/pg_verify_checksums/pg_verify_checksums.c @@ -15,7 +15,6 @@ #include "catalog/pg_control.h" #include "common/controldata_utils.h" -#include "common/relpath.h" #include "getopt_long.h" #include "pg_getopt.h" #include "storage/bufpage.h" @@ -50,69 +49,27 @@ usage(void) printf(_("Report bugs to .\n")); } -/* - * isRelFileName - * - * Check if the given file name is authorized for checksum verification. - */ +static const char *const skip[] = { + "pg_control", + "pg_filenode.map", + "pg_internal.init", + "PG_VERSION", + NULL, +}; + static bool -isRelFileName(const char *fn) +skipfile(const char *fn) { - int pos; + const char *const *f; - /*---------- - * Only files including data checksums are authorized for verification. - * This is guessed based on the file name by reverse-engineering - * GetRelationPath() so make sure to update both code paths if any - * updates are done. The following file name formats are allowed: - * - * . - * _ - * _. - * - * Note that temporary files, beginning with 't', are also skipped. - * - *---------- - */ - - /* A non-empty string of digits should follow */ - for (pos = 0; isdigit((unsigned char) fn[pos]); ++pos) - ; - /* leave if no digits */ - if (pos == 0) - return false; - /* good to go if only digits */ - if (fn[pos] == '\0') + if (strcmp(fn, ".") == 0 || + strcmp(fn, "..") == 0) return true; - /* Authorized fork files can be scanned */ - if (fn[pos] == '_') - { - int forkchar = forkname_chars(&fn[pos + 1], NULL); - - if (forkchar <= 0) - return false; - - pos += forkchar + 1; - } - - /* Check for an optional segment number */ - if (fn[pos] == '.') - { - int segchar; - - for (segchar = 1; isdigit((unsigned char) fn[pos + segchar]); ++segchar) - ; - - if (segchar <= 1) - return false; - pos += segchar; - } - - /* Now this should be the end */ - if (fn[pos] != '\0') - return false; - return true; + for (f = skip; *f; f++) + if (strcmp(*f, fn) == 0) + return true; + return false; } static void @@ -189,7 +146,7 @@ scan_directory(const char *basedir, const char *subdir) char fn[MAXPGPATH]; struct stat st; - if (!isRelFileName(de->d_name)) + if (skipfile(de->d_name)) continue; snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name); diff --git a/src/bin/pg_verify_checksums/t/002_actions.pl b/src/bin/pg_verify_checksums/t/002_actions.pl index 0e1725d9f2..c640cce260 100644 --- a/src/bin/pg_verify_checksums/t/002_actions.pl +++ b/src/bin/pg_verify_checksums/t/002_actions.pl @@ -17,23 +17,6 @@ command_like(['pg_controldata', $pgdata], qr/Data page checksum version:.*1/, 'checksums enabled in control file'); -# Add set of dummy files with some contents. These should not be scanned -# by the tool. - -# On Windows, file name "foo." == "foo", so skip that pattern there. -append_to_file "$pgdata/global/123.", "foo" unless $windows_os; -append_to_file "$pgdata/global/123_", "foo"; -append_to_file "$pgdata/global/123_.", "foo" unless $windows_os;; -append_to_file "$pgdata/global/123.12t", "foo"; -append_to_file "$pgdata/global/foo", "foo2"; -append_to_file "$pgdata/global/t123", "bar"; -append_to_file "$pgdata/global/123a", "bar2"; -append_to_file "$pgdata/global/.123", "foobar"; -append_to_file "$pgdata/global/_fsm", "foobar2"; -append_to_file "$pgdata/global/_init", "foobar3"; -append_to_file "$pgdata/global/_vm.123", "foohoge"; -append_to_file "$pgdata/global/123_vm.123t", "foohoge2"; - # These are correct but empty files, so they should pass through. append_to_file "$pgdata/global/99999", ""; append_to_file "$pgdata/global/99999.123", "";