From 1e46f73b8e2e5e69dc40fd85ae83b88cccc1daf8 Mon Sep 17 00:00:00 2001 From: Sebastian Gniazdowski Date: Sat, 30 Dec 2017 16:32:34 +0100 Subject: 42188: Close flock descriptor in failure cases --- ChangeLog | 5 +++++ Src/Modules/system.c | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d7ab6fea8..f74c26b88 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-01-04 Peter Stephenson + + * Sebastian: 42188: Src/Modules/system.c: It is necessary to + close the lock descriptor in some failure cases. + 2018-01-04 Oliver Kiddle * dana: 42214: Completion/BSD/Type/_file_flags, diff --git a/Src/Modules/system.c b/Src/Modules/system.c index 3eecd7e95..9fd4d2583 100644 --- a/Src/Modules/system.c +++ b/Src/Modules/system.c @@ -649,22 +649,30 @@ bin_zsystem_flock(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) if (timeout > 0) { time_t end = time(NULL) + (time_t)timeout; while (fcntl(flock_fd, F_SETLK, &lck) < 0) { - if (errflag) + if (errflag) { + zclose(flock_fd); return 1; + } if (errno != EINTR && errno != EACCES && errno != EAGAIN) { + zclose(flock_fd); zwarnnam(nam, "failed to lock file %s: %e", args[0], errno); return 1; } - if (time(NULL) >= end) + if (time(NULL) >= end) { + zclose(flock_fd); return 2; + } sleep(1); } } else { while (fcntl(flock_fd, timeout == 0 ? F_SETLK : F_SETLKW, &lck) < 0) { - if (errflag) + if (errflag) { + zclose(flock_fd); return 1; + } if (errno == EINTR) continue; + zclose(flock_fd); zwarnnam(nam, "failed to lock file %s: %e", args[0], errno); return 1; } -- cgit 1.4.1