diff options
author | Kay Sievers <kay@vrfy.org> | 2014-06-03 10:46:51 +0200 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2014-06-06 17:38:01 -0400 |
commit | b493e3e7021fea152016a31f92d948e1197667b2 (patch) | |
tree | 610f96e9686b8fefecb29858ffab7ffc480d7753 /src/libudev | |
parent | 09aadd5a149ae4c423c18938d5fc8589846a9915 (diff) |
udev: always close lock file descriptor
https://bugs.freedesktop.org/show_bug.cgi?id=79576
Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
Diffstat (limited to 'src/libudev')
-rw-r--r-- | src/libudev/util.c | 24 | ||||
-rw-r--r-- | src/libudev/util.h | 2 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/libudev/util.c b/src/libudev/util.c index 4796505a5c..cfdf848cce 100644 --- a/src/libudev/util.c +++ b/src/libudev/util.c @@ -154,6 +154,30 @@ void close_nointr_nofail(int fd) { assert_se(close_nointr(fd) == 0); } +int safe_close(int fd) { + + /* + * Like close_nointr() but cannot fail. Guarantees errno is + * unchanged. Is a NOP with negative fds passed, and returns + * -1, so that it can be used in this syntax: + * + * fd = safe_close(fd); + */ + + if (fd >= 0) { + PROTECT_ERRNO; + + /* The kernel might return pretty much any error code + * via close(), but the fd will be closed anyway. The + * only condition we want to check for here is whether + * the fd was invalid at all... */ + + assert_se(close_nointr(fd) != -EBADF); + } + + return -1; +} + int unlink_noerrno(const char *path) { PROTECT_ERRNO; int r; diff --git a/src/libudev/util.h b/src/libudev/util.h index a950f2658f..332dfb6207 100644 --- a/src/libudev/util.h +++ b/src/libudev/util.h @@ -124,6 +124,8 @@ static inline const char *startswith(const char *s, const char *prefix) { char *endswith(const char *s, const char *postfix) _pure_; int close_nointr(int fd); +int safe_close(int fd); + void close_nointr_nofail(int fd); int safe_atou(const char *s, unsigned *ret_u); |