aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2013-11-18 21:49:40 -0500
committerPeter Eisentraut <peter_e@gmx.net>2013-11-18 22:02:36 -0500
commit8ca75671bd583f2e814c865941da464d2419312c (patch)
treeb94fc44251b4231578c1e52c9effa34ba352076c
parentea2bb1b47d7629a17dbc0c7da66cf063f8d3a768 (diff)
downloadpostgresql-8ca75671bd583f2e814c865941da464d2419312c.tar.gz
postgresql-8ca75671bd583f2e814c865941da464d2419312c.zip
pg_upgrade: Report full disk better
Previously, pg_upgrade would abort copy_file() on a short write without setting errno, which the caller would report as an error with the message "Success". We assume ENOSPC in that case, as we do elsewhere in the code. Also set errno in some other error cases in copy_file() to avoid bogus "Success" error messages. This was broken in 6b711cf37c228749b6a8cef50e16e3c587d18dd4, so 9.2 and before are OK.
-rw-r--r--contrib/pg_upgrade/file.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c
index dfeb79f255d..c198e91ce15 100644
--- a/contrib/pg_upgrade/file.c
+++ b/contrib/pg_upgrade/file.c
@@ -136,16 +136,22 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
int save_errno = 0;
if ((srcfile == NULL) || (dstfile == NULL))
+ {
+ errno = EINVAL;
return -1;
+ }
if ((src_fd = open(srcfile, O_RDONLY, 0)) < 0)
return -1;
if ((dest_fd = open(dstfile, O_RDWR | O_CREAT | (force ? 0 : O_EXCL), S_IRUSR | S_IWUSR)) < 0)
{
+ save_errno = errno;
+
if (src_fd != 0)
close(src_fd);
+ errno = save_errno;
return -1;
}
@@ -170,6 +176,9 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
if (write(dest_fd, buffer, nbytes) != nbytes)
{
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
save_errno = errno;
ret = -1;
break;