Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8503630

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 53a5ceb commit 8503630

File tree

1 file changed

+18
-61
lines changed

1 file changed

+18
-61
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);

0 commit comments

Comments
 (0)