]> granicus.if.org Git - postgresql/commitdiff
Fix error message on short read of pg_control
authorMagnus Hagander <magnus@hagander.net>
Fri, 18 May 2018 15:53:12 +0000 (17:53 +0200)
committerMagnus Hagander <magnus@hagander.net>
Fri, 18 May 2018 15:53:12 +0000 (17:53 +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 742e0e7115e693d127ac953cdc39c9751f8d7f38..0cb1e9981a8b674e38523119dcb43b9ba701686e 100644 (file)
@@ -4475,6 +4475,7 @@ ReadControlFile(void)
 {
        pg_crc32c       crc;
        int                     fd;
+       int                     r;
 
        /*
         * Read data...
@@ -4489,10 +4490,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 f1a097a9746cfea03223c3e54fa836531101fe7b..0aabb0d8643f85e4590b44ca1ffbf820f0800748 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);