From cb54c500d0e1a2c52270b15c6db6a88ca3feb86a Mon Sep 17 00:00:00 2001 From: Mariusz Zaborski Date: Sat, 12 Mar 2022 11:38:12 +0100 Subject: [PATCH] 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 --- usr.bin/touch/touch.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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)