]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Reset properly errno before calling write()
authorMichael Paquier <michael@paquier.xyz>
Sat, 4 Aug 2018 20:32:54 +0000 (05:32 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sat, 4 Aug 2018 20:32:54 +0000 (05:32 +0900)
6cb3372 enforces errno to ENOSPC when less bytes than what is expected
have been written when it is unset, though it forgot to properly reset
errno before doing a system call to write(), causing errno to
potentially come from a previous system call.

Reported-by: Tom Lane
Author: Michael Paquier
Reviewed-by: Tom Lane
Discussion: https://postgr.es/m/31797.1533326676@sss.pgh.pa.us

src/backend/access/transam/twophase.c
src/bin/pg_basebackup/receivelog.c

index 3c732d8f8014a6c5f6d31933499adbd2711650bd..06a16d1fb7d73ddcb4f892452940627de7574ac0 100644 (file)
@@ -1565,6 +1565,7 @@ RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
                                                path)));
 
        /* Write content and CRC */
+       errno = 0;
        if (write(fd, content, len) != len)
        {
                int                     save_errno = errno;
index 3e12d63530e288764743dbd53645c3cbb24e66a4..b2891431eae000330a70dd6af6a3af3130d655b2 100644 (file)
@@ -138,6 +138,7 @@ open_walfile(XLogRecPtr startpoint, uint32 timeline, char *basedir,
        zerobuf = pg_malloc0(XLOG_BLCKSZ);
        for (bytes = 0; bytes < XLogSegSize; bytes += XLOG_BLCKSZ)
        {
+               errno = 0;
                if (write(f, zerobuf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
                {
                        /* if write didn't set errno, assume problem is no disk space */
@@ -1129,6 +1130,7 @@ HandleCopyStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline,
                                        }
                                }
 
+                               errno = 0;
                                if (write(walfile,
                                                  copybuf + hdr_len + bytes_written,
                                                  bytes_to_write) != bytes_to_write)