diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-12-24 18:46:29 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-12-24 18:57:40 -0500 |
commit | 45fa8714a1d35e6555083d88a71851ada2aacac4 (patch) | |
tree | f8bc29a0db8f1afffd2c5369905d4e2049e9c2dc /libsandbox | |
parent | tests: expand usage strings (diff) | |
download | sandbox-45fa8714a1d35e6555083d88a71851ada2aacac4.tar.gz sandbox-45fa8714a1d35e6555083d88a71851ada2aacac4.tar.bz2 sandbox-45fa8714a1d35e6555083d88a71851ada2aacac4.zip |
libsandbox: handle open(O_NOFOLLOW)
We don't check for O_NOFOLLOW in the open wrappers, so we end up
returning the wrong error when operating on broken symlinks.
URL: https://bugs.gentoo.org/413441
Reported-by: Marien Zwart <marienz@gentoo.org>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libsandbox')
-rw-r--r-- | libsandbox/wrapper-funcs/__64_post.h | 1 | ||||
-rw-r--r-- | libsandbox/wrapper-funcs/__64_pre.h | 1 | ||||
-rw-r--r-- | libsandbox/wrapper-funcs/openat_pre_check.c | 2 |
3 files changed, 3 insertions, 1 deletions
diff --git a/libsandbox/wrapper-funcs/__64_post.h b/libsandbox/wrapper-funcs/__64_post.h index 2fd2182..82d2a16 100644 --- a/libsandbox/wrapper-funcs/__64_post.h +++ b/libsandbox/wrapper-funcs/__64_post.h @@ -1,3 +1,4 @@ #undef SB64 #undef stat +#undef lstat #undef off_t diff --git a/libsandbox/wrapper-funcs/__64_pre.h b/libsandbox/wrapper-funcs/__64_pre.h index 2132110..0b34b25 100644 --- a/libsandbox/wrapper-funcs/__64_pre.h +++ b/libsandbox/wrapper-funcs/__64_pre.h @@ -1,3 +1,4 @@ #define SB64 #define stat stat64 +#define lstat lstat64 #define off_t off64_t diff --git a/libsandbox/wrapper-funcs/openat_pre_check.c b/libsandbox/wrapper-funcs/openat_pre_check.c index c827ee6..0127708 100644 --- a/libsandbox/wrapper-funcs/openat_pre_check.c +++ b/libsandbox/wrapper-funcs/openat_pre_check.c @@ -29,7 +29,7 @@ bool sb_openat_pre_check(const char *func, const char *pathname, int dirfd, int /* Doesn't exist -> skip permission checks */ struct stat st; - if (-1 == stat(pathname, &st)) { + if (((flags & O_NOFOLLOW) ? lstat(pathname, &st) : stat(pathname, &st)) == -1) { sb_debug_dyn("EARLY FAIL: %s(%s): %s\n", func, pathname, strerror(errno)); return false; |