Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Reset properly errno before calling write()
authorMichael Paquier <michael@paquier.xyz>
Sat, 4 Aug 2018 20:32:37 +0000 (05:32 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sat, 4 Aug 2018 20:32:37 +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/heap/rewriteheap.c
src/backend/access/transam/twophase.c
src/backend/replication/logical/origin.c
src/backend/replication/logical/reorderbuffer.c
src/backend/replication/logical/snapbuild.c
src/backend/replication/slot.c
src/bin/pg_basebackup/receivelog.c

index dd03543b6b37ec817fb256d81d92dc2b6ab9f34f..c8fa62daeb99f5acf514ddce85d6cde355aa86b9 100644 (file)
@@ -1164,6 +1164,7 @@ heap_xlog_logical_rewrite(XLogReaderState *r)
    len = xlrec->num_mappings * sizeof(LogicalRewriteMappingData);
 
    /* write out tail end of mapping file (again) */
+   errno = 0;
    if (write(fd, data, len) != len)
    {
        /* if write didn't set errno, assume problem is no disk space */
index faf590b7709e618ff679e3807614d77eb45d6269..25d1a0d76947af0a043a8bb5019d9bf205ef6b29 100644 (file)
@@ -1577,6 +1577,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 4ecd6a9eae04d542a604d59446c4fa2a10fac0d1..94832a105bf6dfd903b1d68dbe885a11fb6e1da0 100644 (file)
@@ -547,6 +547,7 @@ CheckPointReplicationOrigin(void)
                        tmppath)));
 
    /* write magic */
+   errno = 0;
    if ((write(tmpfd, &magic, sizeof(magic))) != sizeof(magic))
    {
        int         save_errno = errno;
@@ -590,6 +591,7 @@ CheckPointReplicationOrigin(void)
        /* make sure we only write out a commit that's persistent */
        XLogFlush(local_lsn);
 
+       errno = 0;
        if ((write(tmpfd, &disk_state, sizeof(disk_state))) !=
            sizeof(disk_state))
        {
@@ -612,6 +614,7 @@ CheckPointReplicationOrigin(void)
 
    /* write out the CRC */
    FIN_CRC32C(crc);
+   errno = 0;
    if ((write(tmpfd, &crc, sizeof(crc))) != sizeof(crc))
    {
        int         save_errno = errno;
index 3606e9ec7ffcfe8fb2a7c511445a87126c0bfc78..b73ac5b9243f567c8246c89d1a8dd63f7138fe6f 100644 (file)
@@ -2369,6 +2369,7 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
 
    ondisk->size = sz;
 
+   errno = 0;
    if (write(fd, rb->outbuf, ondisk->size) != ondisk->size)
    {
        int save_errno = errno;
index 2c96fbd5067fa3af28ee2c8f1b51b10691452d01..7a06fe086f620096b4813bf9cedc3d5aa49fc3de 100644 (file)
@@ -1571,6 +1571,7 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
        ereport(ERROR,
                (errmsg("could not open file \"%s\": %m", path)));
 
+   errno = 0;
    if ((write(fd, ondisk, needed_length)) != needed_length)
    {
        int         save_errno = errno;
index a5bc452d8128f768b728a92601fd44d8448b98e6..b42861d62593f302bfc0687a93814f172121dca1 100644 (file)
@@ -1028,6 +1028,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
                SnapBuildOnDiskChecksummedSize);
    FIN_CRC32C(cp.checksum);
 
+   errno = 0;
    if ((write(fd, &cp, sizeof(cp))) != sizeof(cp))
    {
        int         save_errno = errno;
index 71f3fb59b7c344a378839a8dc259cc58e2615e4a..fb70b204f79a735ec176cafd9844e97d322ef701 100644 (file)
@@ -157,6 +157,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 */
@@ -1217,6 +1218,7 @@ ProcessXLogDataMsg(PGconn *conn, char *copybuf, int len,
            }
        }
 
+       errno = 0;
        if (write(walfile,
                  copybuf + hdr_len + bytes_written,
                  bytes_to_write) != bytes_to_write)