From: Michael Paquier Date: Mon, 18 Mar 2019 00:11:52 +0000 (+0900) Subject: Error out in pg_checksums on incompatible block size X-Git-Tag: REL_12_BETA1~510 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa3395659561b564051a2bbd3997de8e2923c8e3;p=postgresql Error out in pg_checksums on incompatible block size pg_checksums is compiled with a given block size and has a hard dependency to it per the way checksums are calculated via checksum_impl.h, and trying to use the tool on a data folder which has not the same block size would result in incorrect checksum calculations and/or block read errors, meaning that the data folder is corrupted. This is harmless as checksums are only checked now, but very confusing for the user so issue an error properly if the block size used at compilation and the block size used in the data folder do not match. Reported-by: Sergei Kornilov Author: Michael Banck, Michael Paquier Reviewed-by: Fabien Coelho, Magnus Hagander Discussion: https://postgr.es/m/20190317054657.GA3357@paquier.xyz ackpatch-through: 11 --- diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 5d4083fa9f..b7ebc11017 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -327,6 +327,15 @@ main(int argc, char *argv[]) exit(1); } + if (ControlFile->blcksz != BLCKSZ) + { + fprintf(stderr, _("%s: database cluster is not compatible.\n"), + progname); + fprintf(stderr, _("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"), + ControlFile->blcksz, BLCKSZ); + exit(1); + } + if (ControlFile->state != DB_SHUTDOWNED && ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY) {