Fix error message on short read of pg_control
authorMagnus Hagander <[email protected]>
Fri, 18 May 2018 15:52:18 +0000 (17:52 +0200)
committerMagnus Hagander <[email protected]>
Fri, 18 May 2018 15:54:18 +0000 (17:54 +0200)
Instead of saying "error: success", indicate that we got a working read
but it was too short.

src/backend/access/transam/xlog.c
src/common/controldata_utils.c

index 04bfac748587b45ad127386df5943b140599c5c4..adbd6a2126420441d63e73c2a71a3cfacd497624 100644 (file)
@@ -4486,6 +4486,7 @@ ReadControlFile(void)
    pg_crc32c   crc;
    int         fd;
    static char wal_segsz_str[20];
+   int         r;
 
    /*
     * Read data...
@@ -4499,10 +4500,17 @@ ReadControlFile(void)
                        XLOG_CONTROL_FILE)));
 
    pgstat_report_wait_start(WAIT_EVENT_CONTROL_FILE_READ);
-   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))));
+   }
    pgstat_report_wait_end();
 
    close(fd);
index f12a1888562b3ef283466a436093de920cd8210f..78a9f0ce62ceb1d9bb0c07e62d82bc2b6747bcc8 100644 (file)
@@ -44,6 +44,7 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
    int         fd;
    char        ControlFilePath[MAXPGPATH];
    pg_crc32c   crc;
+   int         r;
 
    AssertArg(crc_ok_p);
 
@@ -64,18 +65,34 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
    }
 #endif
 
-   if (read(fd, ControlFile, sizeof(ControlFileData)) != sizeof(ControlFileData))
+   r = read(fd, ControlFile, sizeof(ControlFileData));
+   if (r != sizeof(ControlFileData))
+   {
+       if (r < 0)
 #ifndef FRONTEND
-       ereport(ERROR,
-               (errcode_for_file_access(),
-                errmsg("could not read file \"%s\": %m", ControlFilePath)));
+           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);
-   }
+       {
+           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);