1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-03 22:24:49 +03:00

Ensure write failure reports no-disk-space

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
This commit is contained in:
Alvaro Herrera 2020-06-19 16:46:07 -04:00
parent 9496908d46
commit 83762d0a92
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
2 changed files with 30 additions and 1 deletions

View File

@ -751,8 +751,12 @@ writeTarData(
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
if (ztarfile != NULL) if (ztarfile != NULL)
{ {
errno = 0;
if (gzwrite(ztarfile, buf, r) != r) 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, fprintf(stderr,
_("%s: could not write to compressed file \"%s\": %s\n"), _("%s: could not write to compressed file \"%s\": %s\n"),
progname, current_file, get_gz_error(ztarfile)); progname, current_file, get_gz_error(ztarfile));
@ -762,8 +766,12 @@ writeTarData(
else else
#endif #endif
{ {
errno = 0;
if (fwrite(buf, r, 1, tarfile) != 1) 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"), fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
progname, current_file, strerror(errno)); progname, current_file, strerror(errno));
disconnect_and_exit(1); disconnect_and_exit(1);
@ -1368,8 +1376,12 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
continue; continue;
} }
errno = 0;
if (fwrite(copybuf, r, 1, file) != 1) 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"), fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
progname, filename, strerror(errno)); progname, filename, strerror(errno));
disconnect_and_exit(1); disconnect_and_exit(1);

View File

@ -356,10 +356,15 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
{ {
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
errno = 0;
if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen) 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", exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
}
return; return;
} }
@ -496,9 +501,15 @@ _WriteByte(ArchiveHandle *AH, const int i)
unsigned char c = (unsigned char) i; unsigned char c = (unsigned char) i;
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
errno = 0;
if (cfwrite(&c, 1, ctx->dataFH) != 1) 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", exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
}
return 1; return 1;
} }
@ -526,9 +537,15 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
{ {
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
errno = 0;
if (cfwrite(buf, len, ctx->dataFH) != len) 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", exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
}
return; return;
} }