support: Close fds in copy_func

Message ID 20210512044706.462992-1-siddhesh@sourceware.org
State Committed
Commit 75fe6d1a1620d84e0e487868feba9b2c0f109610
Headers
Series support: Close fds in copy_func |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Siddhesh Poyarekar May 12, 2021, 4:47 a.m. UTC
  copy_func may leave file descriptors open on error, so close them on
function exit.
---
 support/shell-container.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)
  

Comments

DJ Delorie May 12, 2021, 7:36 p.m. UTC | #1
Siddhesh Poyarekar via Libc-alpha <libc-alpha@sourceware.org> writes:

> copy_func may leave file descriptors open on error, so close them on
> function exit.

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>
  

Patch

diff --git a/support/shell-container.c b/support/shell-container.c
index b64974086a..b2a4324dc7 100644
--- a/support/shell-container.c
+++ b/support/shell-container.c
@@ -93,8 +93,9 @@  copy_func (char **argv)
 {
   char *sname = argv[0];
   char *dname = argv[1];
-  int sfd, dfd;
+  int sfd = -1, dfd = -1;
   struct stat st;
+  int ret = 1;
 
   sfd = open (sname, O_RDONLY);
   if (sfd < 0)
@@ -108,7 +109,7 @@  copy_func (char **argv)
     {
       fprintf (stderr, "cp: unable to fstat %s: %s\n",
 	       sname, strerror (errno));
-      return 1;
+      goto out;
     }
 
   dfd = open (dname, O_WRONLY | O_TRUNC | O_CREAT, 0600);
@@ -116,22 +117,26 @@  copy_func (char **argv)
     {
       fprintf (stderr, "cp: unable to open %s for writing: %s\n",
 	       dname, strerror (errno));
-      return 1;
+      goto out;
     }
 
   if (support_copy_file_range (sfd, 0, dfd, 0, st.st_size, 0) != st.st_size)
     {
       fprintf (stderr, "cp: cannot copy file %s to %s: %s\n",
 	       sname, dname, strerror (errno));
-      return 1;
+      goto out;
     }
 
-  close (sfd);
-  close (dfd);
-
+  ret = 0;
   chmod (dname, st.st_mode & 0777);
 
-  return 0;
+out:
+  if (sfd >= 0)
+    close (sfd);
+  if (dfd >= 0)
+    close (dfd);
+
+  return ret;
 
 }