From 1d7a6e3eb45946db86d6d1776c55323740d955b0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 3 Sep 2019 08:26:55 +0200 Subject: [PATCH] pg_checksums: Handle read and write returns correctly The read() return was not checking for errors, the write() return was not checking for short writes. Reviewed-by: Michael Paquier Discussion: https://www.postgresql.org/message-id/flat/5de61b6b-8be9-7771-0048-860328efe027%402ndquadrant.com --- src/bin/pg_checksums/pg_checksums.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 8c00ec9a3b..971ae73f54 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -198,8 +198,12 @@ scan_file(const char *fn, BlockNumber segmentno) break; if (r != BLCKSZ) { - pg_log_error("could not read block %u in file \"%s\": read %d of %d", - blockno, fn, r, BLCKSZ); + if (r < 0) + pg_log_error("could not read block %u in file \"%s\": %m", + blockno, fn); + else + pg_log_error("could not read block %u in file \"%s\": read %d of %d", + blockno, fn, r, BLCKSZ); exit(1); } blocks++; @@ -222,6 +226,8 @@ scan_file(const char *fn, BlockNumber segmentno) } else if (mode == PG_MODE_ENABLE) { + int w; + /* Set checksum in page header */ header->pd_checksum = csum; @@ -233,10 +239,15 @@ scan_file(const char *fn, BlockNumber segmentno) } /* Write block with checksum */ - if (write(f, buf.data, BLCKSZ) != BLCKSZ) + w = write(f, buf.data, BLCKSZ); + if (w != BLCKSZ) { - pg_log_error("could not write block %u in file \"%s\": %m", - blockno, fn); + if (w < 0) + pg_log_error("could not write block %u in file \"%s\": %m", + blockno, fn); + else + pg_log_error("could not write block %u in file \"%s\": wrote %d of %d", + blockno, fn, w, BLCKSZ); exit(1); } }