diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c
index 93ffd7b798ba07278870a192ee1242f66345d51c..b5d78a57debdc8e05c3e6b38034f9cdefe3729a2 100644
--- a/contrib/pg_upgrade/file.c
+++ b/contrib/pg_upgrade/file.c
@@ -133,6 +133,8 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
 	int			src_fd;
 	int			dest_fd;
 	char	   *buffer;
+	int			ret = 0;
+	int         save_errno = 0;
 
 	if ((srcfile == NULL) || (dstfile == NULL))
 		return -1;
@@ -150,17 +152,6 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
 
 	buffer = (char *) pg_malloc(COPY_BUF_SIZE);
 
-	if (buffer == NULL)
-	{
-		if (src_fd != 0)
-			close(src_fd);
-
-		if (dest_fd != 0)
-			close(dest_fd);
-
-		return -1;
-	}
-
 	/* perform data copying i.e read src source, write to destination */
 	while (true)
 	{
@@ -168,19 +159,9 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
 
 		if (nbytes < 0)
 		{
-			int			save_errno = errno;
-
-			if (buffer != NULL)
-				pg_free(buffer);
-
-			if (src_fd != 0)
-				close(src_fd);
-
-			if (dest_fd != 0)
-				close(dest_fd);
-
-			errno = save_errno;
-			return -1;
+			save_errno = errno;
+			ret = -1;
+			break;
 		}
 
 		if (nbytes == 0)
@@ -190,25 +171,13 @@ 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 */
-			int			save_errno = errno ? errno : ENOSPC;
-
-			if (buffer != NULL)
-				pg_free(buffer);
-
-			if (src_fd != 0)
-				close(src_fd);
-
-			if (dest_fd != 0)
-				close(dest_fd);
-
-			errno = save_errno;
-			return -1;
+			save_errno = errno;
+			ret = -1;
+			break;
 		}
 	}
 
-	if (buffer != NULL)
-		pg_free(buffer);
+	pg_free(buffer);
 
 	if (src_fd != 0)
 		close(src_fd);
@@ -216,7 +185,10 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
 	if (dest_fd != 0)
 		close(dest_fd);
 
-	return 1;
+	if (save_errno != 0)
+		errno = save_errno;
+
+	return ret;
 }
 #endif