]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Ensure write failure reports no-disk-space
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Jun 2020 20:46:07 +0000 (16:46 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Jun 2020 20:46:07 +0000 (16:46 -0400)
A few places calling fwrite and gzwrite were not setting errno to ENOSPC
when reporting errors, as is customary; this led to some failures being
reported as
"could not write file: Success"
which makes us look silly.  Make a few of these places in pg_dump and
pg_basebackup use our customary pattern.

Backpatch-to: 9.5
Author: Justin Pryzby <pryzby@telsasoft.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/20200611153753.GU14879@telsasoft.com

src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_dump/pg_backup_directory.c

index f8969254f059d940f192621a1839d88836681529..2a3e33eb08eaff72260626c20b70fc0d139c7e97 100644 (file)
@@ -902,8 +902,12 @@ writeTarData(
 #ifdef HAVE_LIBZ
        if (ztarfile != NULL)
        {
+               errno = 0;
                if (gzwrite(ztarfile, buf, r) != r)
                {
+                       /* if write didn't set errno, assume problem is no disk space */
+                       if (errno == 0)
+                               errno = ENOSPC;
                        fprintf(stderr,
                                        _("%s: could not write to compressed file \"%s\": %s\n"),
                                        progname, current_file, get_gz_error(ztarfile));
@@ -913,8 +917,12 @@ writeTarData(
        else
 #endif
        {
+               errno = 0;
                if (fwrite(buf, r, 1, tarfile) != 1)
                {
+                       /* if write didn't set errno, assume problem is no disk space */
+                       if (errno == 0)
+                               errno = ENOSPC;
                        fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
                                        progname, current_file, strerror(errno));
                        disconnect_and_exit(1);
@@ -1526,8 +1534,12 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
                                continue;
                        }
 
+                       errno = 0;
                        if (fwrite(copybuf, r, 1, file) != 1)
                        {
+                               /* if write didn't set errno, assume problem is no disk space */
+                               if (errno == 0)
+                                       errno = ENOSPC;
                                fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
                                                progname, filename, strerror(errno));
                                disconnect_and_exit(1);
index 1caf89598a31e266566322e524e4cb44e5e09bea..acf7a485e9221c9b6eb97f2c28f9605144a5434c 100644 (file)
@@ -351,10 +351,15 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
 {
        lclContext *ctx = (lclContext *) AH->formatData;
 
+       errno = 0;
        if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen)
+       {
+               /* if write didn't set errno, assume problem is no disk space */
+               if (errno == 0)
+                       errno = ENOSPC;
                exit_horribly(modulename, "could not write to output file: %s\n",
                                          get_cfp_error(ctx->dataFH));
-
+       }
 
        return;
 }
@@ -491,9 +496,15 @@ _WriteByte(ArchiveHandle *AH, const int i)
        unsigned char c = (unsigned char) i;
        lclContext *ctx = (lclContext *) AH->formatData;
 
+       errno = 0;
        if (cfwrite(&c, 1, ctx->dataFH) != 1)
+       {
+               /* if write didn't set errno, assume problem is no disk space */
+               if (errno == 0)
+                       errno = ENOSPC;
                exit_horribly(modulename, "could not write to output file: %s\n",
                                          get_cfp_error(ctx->dataFH));
+       }
 
        return 1;
 }
@@ -521,9 +532,15 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
 {
        lclContext *ctx = (lclContext *) AH->formatData;
 
+       errno = 0;
        if (cfwrite(buf, len, ctx->dataFH) != len)
+       {
+               /* if write didn't set errno, assume problem is no disk space */
+               if (errno == 0)
+                       errno = ENOSPC;
                exit_horribly(modulename, "could not write to output file: %s\n",
                                          get_cfp_error(ctx->dataFH));
+       }
 
        return;
 }