From 3e20b7fa408f1b5a1bf17120b55b5473e82a7e63 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
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 <michael@paquier.xyz>
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 8c00ec9a3b1..971ae73f544 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);
 			}
 		}
-- 
GitLab