diff options
author | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2021-05-12 10:13:41 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2021-05-13 08:07:20 +0530 |
commit | 75fe6d1a1620d84e0e487868feba9b2c0f109610 (patch) | |
tree | 09c0dcb9684c5907ad5711508b54d3fdeaa1b593 /support | |
parent | 7eeb05a3958407675d3c4c5351d8ed7738156fbf (diff) | |
download | glibc-75fe6d1a1620d84e0e487868feba9b2c0f109610.tar.gz glibc-75fe6d1a1620d84e0e487868feba9b2c0f109610.tar.xz glibc-75fe6d1a1620d84e0e487868feba9b2c0f109610.zip |
support: Close fds in copy_func
copy_func may leave file descriptors open on error, so close them on function exit.
Diffstat (limited to 'support')
-rw-r--r-- | support/shell-container.c | 21 |
1 files changed, 13 insertions, 8 deletions
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; } |