Skip to content

Commit a1c91dd

Browse files
committed
Switch pg_verify_checksums back to a blacklist
This basically reverts commit d55241a, leaving around a portion of the regression tests still adapted with empty relation files, and corrupted cases. This is also proving to be failing to check properly relation files located in a non-default tablespace path. Per discussion with various folks, including Stephen Frost, David Steele, Andres Freund, Michael Banck and myself. Reported-by: Michael Banck Discussion: https://postgr.es/m/20181021134206.GA14282@paquier.xyz Backpatch-through: 11
1 parent d328991 commit a1c91dd

File tree

2 files changed

+18
-78
lines changed

2 files changed

+18
-78
lines changed

src/bin/pg_verify_checksums/pg_verify_checksums.c

Lines changed: 18 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#include "catalog/pg_control.h"
1717
#include "common/controldata_utils.h"
18-
#include "common/relpath.h"
1918
#include "getopt_long.h"
2019
#include "pg_getopt.h"
2120
#include "storage/bufpage.h"
@@ -50,69 +49,27 @@ usage(void)
5049
printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
5150
}
5251

53-
/*
54-
* isRelFileName
55-
*
56-
* Check if the given file name is authorized for checksum verification.
57-
*/
52+
static const char *const skip[] = {
53+
"pg_control",
54+
"pg_filenode.map",
55+
"pg_internal.init",
56+
"PG_VERSION",
57+
NULL,
58+
};
59+
5860
static bool
59-
isRelFileName(const char *fn)
61+
skipfile(const char *fn)
6062
{
61-
int pos;
62-
63-
/*----------
64-
* Only files including data checksums are authorized for verification.
65-
* This is guessed based on the file name by reverse-engineering
66-
* GetRelationPath() so make sure to update both code paths if any
67-
* updates are done. The following file name formats are allowed:
68-
* <digits>
69-
* <digits>.<segment>
70-
* <digits>_<forkname>
71-
* <digits>_<forkname>.<segment>
72-
*
73-
* Note that temporary files, beginning with 't', are also skipped.
74-
*
75-
*----------
76-
*/
77-
78-
/* A non-empty string of digits should follow */
79-
for (pos = 0; isdigit((unsigned char) fn[pos]); ++pos)
80-
;
81-
/* leave if no digits */
82-
if (pos == 0)
83-
return false;
84-
/* good to go if only digits */
85-
if (fn[pos] == '\0')
86-
return true;
87-
88-
/* Authorized fork files can be scanned */
89-
if (fn[pos] == '_')
90-
{
91-
int forkchar = forkname_chars(&fn[pos + 1], NULL);
92-
93-
if (forkchar <= 0)
94-
return false;
63+
const char *const *f;
9564

96-
pos += forkchar + 1;
97-
}
98-
99-
/* Check for an optional segment number */
100-
if (fn[pos] == '.')
101-
{
102-
int segchar;
103-
104-
for (segchar = 1; isdigit((unsigned char) fn[pos + segchar]); ++segchar)
105-
;
106-
107-
if (segchar <= 1)
108-
return false;
109-
pos += segchar;
110-
}
65+
if (strcmp(fn, ".") == 0 ||
66+
strcmp(fn, "..") == 0)
67+
return true;
11168

112-
/* Now this should be the end */
113-
if (fn[pos] != '\0')
114-
return false;
115-
return true;
69+
for (f = skip; *f; f++)
70+
if (strcmp(*f, fn) == 0)
71+
return true;
72+
return false;
11673
}
11774

11875
static void
@@ -189,7 +146,7 @@ scan_directory(const char *basedir, const char *subdir)
189146
char fn[MAXPGPATH];
190147
struct stat st;
191148

192-
if (!isRelFileName(de->d_name))
149+
if (skipfile(de->d_name))
193150
continue;
194151

195152
snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name);

src/bin/pg_verify_checksums/t/002_actions.pl

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,6 @@
1717
qr/Data page checksum version:.*1/,
1818
'checksums enabled in control file');
1919

20-
# Add set of dummy files with some contents. These should not be scanned
21-
# by the tool.
22-
23-
# On Windows, file name "foo." == "foo", so skip that pattern there.
24-
append_to_file "$pgdata/global/123.", "foo" unless $windows_os;
25-
append_to_file "$pgdata/global/123_", "foo";
26-
append_to_file "$pgdata/global/123_.", "foo" unless $windows_os;;
27-
append_to_file "$pgdata/global/123.12t", "foo";
28-
append_to_file "$pgdata/global/foo", "foo2";
29-
append_to_file "$pgdata/global/t123", "bar";
30-
append_to_file "$pgdata/global/123a", "bar2";
31-
append_to_file "$pgdata/global/.123", "foobar";
32-
append_to_file "$pgdata/global/_fsm", "foobar2";
33-
append_to_file "$pgdata/global/_init", "foobar3";
34-
append_to_file "$pgdata/global/_vm.123", "foohoge";
35-
append_to_file "$pgdata/global/123_vm.123t", "foohoge2";
36-
3720
# These are correct but empty files, so they should pass through.
3821
append_to_file "$pgdata/global/99999", "";
3922
append_to_file "$pgdata/global/99999.123", "";

0 commit comments

Comments
 (0)