mirror of
https://github.com/postgres/postgres.git
synced 2025-11-04 20:11:56 +03:00
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
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user