summaryrefslogtreecommitdiff
path: root/src/truncate.c
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2012-08-04 11:02:40 +0200
committerJim Meyering <meyering@redhat.com>2012-08-04 12:27:20 +0200
commitcbd1cffa3eb9e6e5ca82ec67d3c4211a019dd1ed (patch)
tree3cbd529aad8b0af8c2f638dee9f07857fdeff9f2 /src/truncate.c
parent4bee223d96fe34fd5290575ddb6eba7c9c7d7418 (diff)
downloadcoreutils-cbd1cffa3eb9e6e5ca82ec67d3c4211a019dd1ed.tar.xz
truncate: don't leak a file descriptor with --ref=PIPE
* src/truncate.c (main): For a user who makes the mistake of using a non-seekable file as a reference for the desired length, truncate would open that file, attempt to seek to its end, but upon seek failure would neglect to close the file descriptor. Close the file descriptor even when lseek fails. In addition, ignore failure to close that reference FD, since as long as the lseek succeeds, a close failure doesn't matter. Coverity spotted the potential FD leak. Improved-by: Pádraig Brady.
Diffstat (limited to 'src/truncate.c')
-rw-r--r--src/truncate.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/truncate.c b/src/truncate.c
index c1e966617..d638993d6 100644
--- a/src/truncate.c
+++ b/src/truncate.c
@@ -370,8 +370,15 @@ main (int argc, char **argv)
if (0 <= ref_fd)
{
off_t file_end = lseek (ref_fd, 0, SEEK_END);
- if (0 <= file_end && close (ref_fd) == 0)
+ int saved_errno = errno;
+ close (ref_fd); /* ignore failure */
+ if (0 <= file_end)
file_size = file_end;
+ else
+ {
+ /* restore, in case close clobbered it. */
+ errno = saved_errno;
+ }
}
}
if (file_size < 0)