diff options
| author | Mariusz Zaborski <oshogbo@FreeBSD.org> | 2022-03-12 10:38:12 +0000 |
|---|---|---|
| committer | Mariusz Zaborski <oshogbo@FreeBSD.org> | 2022-03-12 10:38:12 +0000 |
| commit | cb54c500d0e1a2c52270b15c6db6a88ca3feb86a (patch) | |
| tree | b6d67f2219d70667fa5ea6f2add2535cd1613a40 | |
| parent | 54b75edd9ef1efbc25475b0adc6e83f77b91c49f (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.c | 10 |
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) |
