diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2017-08-02 18:26:26 -0400 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2017-08-02 18:26:59 -0400 |
commit | 4d57e83816778c6f61ea35c697f937a6f9c3c3de (patch) | |
tree | b1cebe54a1823f771d2fe00aa52499e360272ebb /src/bin/pg_dump/compress_io.c | |
parent | 80215156f9a10dfcacfcef15be35ebb0d79300b5 (diff) | |
download | postgresql-4d57e83816778c6f61ea35c697f937a6f9c3c3de.tar.gz postgresql-4d57e83816778c6f61ea35c697f937a6f9c3c3de.zip |
Fix pg_dump's errno checking for zlib I/O
Some error reports were reporting strerror(errno), which for some error
conditions coming from zlib are wrong, resulting in confusing reports
such as
pg_restore: [compress_io] could not read from input file: Success
which makes no sense. To correctly extract the error message we need to
use gzerror(), so let's do that.
This isn't as comprehensive or as neat as I would like, but at least it
should improve things in many common cases. The zlib abstraction in
compress_io does not seem to be applied consistently enough; we could
perhaps improve that, but it seems master-only material, not a bug fix
for back-patching.
This problem goes back all the way, but I decided to apply back to 9.4
only, because older branches don't contain commit 14ea89366 which this
change depends on.
Authors: Vladimir Kunschikov, Álvaro Herrera
Discussion: https://postgr.es/m/1498120508308.9826@infotecs.ru
Diffstat (limited to 'src/bin/pg_dump/compress_io.c')
-rw-r--r-- | src/bin/pg_dump/compress_io.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c index 991fe11e8a6..e94f7d32743 100644 --- a/src/bin/pg_dump/compress_io.c +++ b/src/bin/pg_dump/compress_io.c @@ -592,8 +592,14 @@ cfread(void *ptr, int size, cfp *fp) { ret = gzread(fp->compressedfp, ptr, size); if (ret != size && !gzeof(fp->compressedfp)) + { + int errnum; + const char *errmsg = gzerror(fp->compressedfp, &errnum); + exit_horribly(modulename, - "could not read from input file: %s\n", strerror(errno)); + "could not read from input file: %s\n", + errnum == Z_ERRNO ? strerror(errno) : errmsg); + } } else #endif @@ -695,6 +701,22 @@ cfeof(cfp *fp) return feof(fp->uncompressedfp); } +const char * +get_cfp_error(cfp *fp) +{ +#ifdef HAVE_LIBZ + if (fp->compressedfp) + { + int errnum; + const char *errmsg = gzerror(fp->compressedfp, &errnum); + + if (errnum != Z_ERRNO) + return errmsg; + } +#endif + return strerror(errno); +} + #ifdef HAVE_LIBZ static int hasSuffix(const char *filename, const char *suffix) |