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)