9pfs: fix O_PATH build break with older glibc versions
When O_PATH is used with O_DIRECTORY, it only acts as an optimization: the openat() syscall simply finds the name in the VFS, and doesn't trigger the underlying filesystem. On systems that don't define O_PATH, because they have glibc version 2.13 or older for example, we can safely omit it. We don't want to deactivate O_PATH globally though, in case it is used without O_DIRECTORY. The is done with a dedicated macro. Systems without O_PATH may thus fail to resolve names that involve unreadable directories, compared to newer systems succeeding, but such corner case failure is our only option on those older systems to avoid the security hole of chasing symlinks inappropriately. Signed-off-by: Greg Kurz <groug@kaod.org> Reviewed-by: Eric Blake <eblake@redhat.com> (added last paragraph to changelog as suggested by Eric Blake) Signed-off-by: Greg Kurz <groug@kaod.org>
This commit is contained in:
parent
b314f6a077
commit
918112c02a
@ -22,7 +22,12 @@ static inline void close_preserve_errno(int fd)
|
|||||||
|
|
||||||
static inline int openat_dir(int dirfd, const char *name)
|
static inline int openat_dir(int dirfd, const char *name)
|
||||||
{
|
{
|
||||||
return openat(dirfd, name, O_DIRECTORY | O_RDONLY | O_PATH);
|
#ifdef O_PATH
|
||||||
|
#define OPENAT_DIR_O_PATH O_PATH
|
||||||
|
#else
|
||||||
|
#define OPENAT_DIR_O_PATH 0
|
||||||
|
#endif
|
||||||
|
return openat(dirfd, name, O_DIRECTORY | O_RDONLY | OPENAT_DIR_O_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int openat_file(int dirfd, const char *name, int flags,
|
static inline int openat_file(int dirfd, const char *name, int flags,
|
||||||
|
Loading…
Reference in New Issue
Block a user