]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pg_waldump: Fix error message for WAL files smaller than XLOG_BLCKSZ.
authorAndres Freund <andres@anarazel.de>
Fri, 25 Feb 2022 18:40:32 +0000 (10:40 -0800)
committerAndres Freund <andres@anarazel.de>
Fri, 25 Feb 2022 18:40:32 +0000 (10:40 -0800)
When opening a WAL file smaller than XLOG_BLCKSZ (e.g. 0 bytes long) while
determining the wal_segment_size, pg_waldump checked errno, despite errno not
being set by the short read. Resulting in a bogus error message.

Author: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Discussion: https://postgr.es/m/20220214.181847.775024684568733277.horikyota.ntt@gmail.com
Backpatch: 11-, the bug was introducedin fc49e24fa

src/bin/pg_waldump/pg_waldump.c

index 639bfcd7f7d92fc442e1702b60f9e0c2fa5e5f5c..cd202a50ced6bea14d036ffab08b859e802c6267 100644 (file)
@@ -210,8 +210,10 @@ search_directory(const char *directory, const char *fname)
        if (fd >= 0)
        {
                PGAlignedXLogBlock buf;
+               int                     r;
 
-               if (read(fd, buf.data, XLOG_BLCKSZ) == XLOG_BLCKSZ)
+               r = read(fd, buf.data, XLOG_BLCKSZ);
+               if (r == XLOG_BLCKSZ)
                {
                        XLogLongPageHeader longhdr = (XLogLongPageHeader) buf.data;
 
@@ -223,14 +225,12 @@ search_directory(const char *directory, const char *fname)
                                                                         WalSegSz),
                                                        fname, WalSegSz);
                }
+               else if (r < 0)
+                       fatal_error("could not read file \"%s\": %s",
+                                               fname, strerror(errno));
                else
-               {
-                       if (errno != 0)
-                               fatal_error("could not read file \"%s\": %s",
-                                                       fname, strerror(errno));
-                       else
-                               fatal_error("not enough data in file \"%s\"", fname);
-               }
+                       fatal_error("not enough data in file \"%s\"", fname);
+
                close(fd);
                return true;
        }