aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Zaborski <oshogbo@FreeBSD.org>2022-03-12 10:38:12 +0000
committerMariusz Zaborski <oshogbo@FreeBSD.org>2022-03-12 10:38:12 +0000
commitcb54c500d0e1a2c52270b15c6db6a88ca3feb86a (patch)
treeb6d67f2219d70667fa5ea6f2add2535cd1613a40
parent54b75edd9ef1efbc25475b0adc6e83f77b91c49f (diff)
touch: don't leak descriptor if fstat(2) fails
If fstat(2) fails the close(2) won't be called, which will leak the file descriptor. The idea was borrowed from OpenBSD, where similar patch was applied for futimens(2). MFC after: 1 week
-rw-r--r--usr.bin/touch/touch.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/usr.bin/touch/touch.c b/usr.bin/touch/touch.c
index 62f77d46e429..1594eacb67d0 100644
--- a/usr.bin/touch/touch.c
+++ b/usr.bin/touch/touch.c
@@ -177,11 +177,19 @@ main(int argc, char *argv[])
/* Create the file. */
fd = open(*argv,
O_WRONLY | O_CREAT, DEFFILEMODE);
- if (fd == -1 || fstat(fd, &sb) || close(fd)) {
+ if (fd == -1) {
rval = 1;
warn("%s", *argv);
continue;
}
+ if (fstat(fd, &sb) < 0) {
+ warn("%s", *argv);
+ rval = 1;
+ }
+ if (close(fd) < 0) {
+ warn("%s", *argv);
+ rval = 1;
+ }
/* If using the current time, we're done. */
if (!timeset)