diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 61061e5257..98abc4961f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -4311,6 +4311,7 @@ ReadControlFile(void) { pg_crc32c crc; int fd; + int r; /* * Read data... @@ -4324,10 +4325,17 @@ ReadControlFile(void) errmsg("could not open control file \"%s\": %m", XLOG_CONTROL_FILE))); - if (read(fd, ControlFile, sizeof(ControlFileData)) != sizeof(ControlFileData)) - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not read from control file: %m"))); + r = read(fd, ControlFile, sizeof(ControlFileData)); + if (r != sizeof(ControlFileData)) + { + if (r < 0) + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not read from control file: %m"))); + else + ereport(PANIC, + (errmsg("could not read from control file: read %d bytes, expected %d", r, (int) sizeof(ControlFileData)))); + } close(fd); diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c index 5592fe7039..598df059e7 100644 --- a/src/common/controldata_utils.c +++ b/src/common/controldata_utils.c @@ -41,6 +41,7 @@ get_controlfile(char *DataDir, const char *progname) int fd; char ControlFilePath[MAXPGPATH]; pg_crc32c crc; + int r; ControlFile = palloc(sizeof(ControlFileData)); snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir); @@ -59,18 +60,34 @@ get_controlfile(char *DataDir, const char *progname) } #endif - if (read(fd, ControlFile, sizeof(ControlFileData)) != sizeof(ControlFileData)) -#ifndef FRONTEND - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", ControlFilePath))); -#else + r = read(fd, ControlFile, sizeof(ControlFileData)); + if (r != sizeof(ControlFileData)) { - fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), - progname, ControlFilePath, strerror(errno)); - exit(EXIT_FAILURE); - } + if (r < 0) +#ifndef FRONTEND + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", ControlFilePath))); +#else + { + fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), + progname, ControlFilePath, strerror(errno)); + exit(EXIT_FAILURE); + } #endif + else +#ifndef FRONTEND + ereport(ERROR, + (errmsg("could not read file \"%s\": read %d bytes, expected %d", + ControlFilePath, r, (int) sizeof(ControlFileData)))); +#else + { + fprintf(stderr, _("%s: could not read file \"%s\": read %d bytes, expected %d\n"), + progname, ControlFilePath, r, (int) sizeof(ControlFileData)); + exit(EXIT_FAILURE); + } +#endif + } close(fd);