X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Futil.c;h=aa1f19ed69a3deec6e27259922c65a94bc0ecfe8;hb=c4731d1135d54609e33df1569fefbb0c96824896;hp=21afdceb8cc4cf666de6d36318c1ea30be175de7;hpb=022707d96113accf6898b0a59be3a3acde2c6832;p=elogind.git diff --git a/src/util.c b/src/util.c index 21afdceb8..aa1f19ed6 100644 --- a/src/util.c +++ b/src/util.c @@ -3436,7 +3436,18 @@ bool null_or_empty(struct stat *st) { } DIR *xopendirat(int fd, const char *name, int flags) { - return fdopendir(openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags)); + int nfd; + DIR *d; + + if ((nfd = openat(fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags)) < 0) + return NULL; + + if (!(d = fdopendir(nfd))) { + close_nointr_nofail(nfd); + return NULL; + } + + return d; } int signal_from_string_try_harder(const char *s) {