diff options
author | Sebastian Gniazdowski <psprint@zdharma.org> | 2017-12-30 16:32:34 +0100 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2018-01-04 17:06:22 +0000 |
commit | 1e46f73b8e2e5e69dc40fd85ae83b88cccc1daf8 (patch) | |
tree | 22004e23eaf571bb59e9d6eb54e5188efc39e03e /Src | |
parent | 21a09a14181851e931f9b2b65704044eed169fb7 (diff) | |
download | zsh-1e46f73b8e2e5e69dc40fd85ae83b88cccc1daf8.tar.gz zsh-1e46f73b8e2e5e69dc40fd85ae83b88cccc1daf8.tar.xz zsh-1e46f73b8e2e5e69dc40fd85ae83b88cccc1daf8.zip |
42188: Close flock descriptor in failure cases
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/system.c | 14 |
1 files changed, 11 insertions, 3 deletions
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; } |