Message ID | 877dual7ex.fsf@oldenburg2.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | Linux: Use faccessat2 to implement faccessat (bug 18683) | expand |
On 07/08/2020 13:58, Florian Weimer via Libc-alpha wrote: > This provides correct AT_EACCESS handling and also takes > Linux security modules into account. > > Tested on i686-linux-gnu, x86_64-linux-gnu. Built with > build-many-glibcs.py. LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > --- > sysdeps/unix/sysv/linux/faccessat.c | 14 +++++++++++--- > sysdeps/unix/sysv/linux/kernel-features.h | 8 ++++++++ > 2 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/sysdeps/unix/sysv/linux/faccessat.c b/sysdeps/unix/sysv/linux/faccessat.c > index e4f18ab2db..56cb6dcc8b 100644 > --- a/sysdeps/unix/sysv/linux/faccessat.c > +++ b/sysdeps/unix/sysv/linux/faccessat.c > @@ -30,6 +30,13 @@ > int > faccessat (int fd, const char *file, int mode, int flag) > { > + int ret = INLINE_SYSCALL_CALL (faccessat2, fd, file, mode, flag); > +#if __ASSUME_FACCESSAT2 > + return ret; > +#else > + if (ret == 0 || errno != ENOSYS) > + return ret; > + > if (flag & ~(AT_SYMLINK_NOFOLLOW | AT_EACCESS)) > return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); > Ok. > @@ -41,9 +48,9 @@ faccessat (int fd, const char *file, int mode, int flag) > return -1; > > mode &= (X_OK | W_OK | R_OK); /* Clear any bogus bits. */ > -#if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH > -# error Oops, portability assumptions incorrect. > -#endif > +# if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH > +# error Oops, portability assumptions incorrect. > +# endif > > if (mode == F_OK) > return 0; /* The file exists. */ Ok. > @@ -68,4 +75,5 @@ faccessat (int fd, const char *file, int mode, int flag) > return 0; > > return INLINE_SYSCALL_ERROR_RETURN_VALUE (EACCES); > +#endif /* !__ASSUME_FACCESSAT2 */ > } Ok. > diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h > index 32533e94cf..a6bbc3c94e 100644 > --- a/sysdeps/unix/sysv/linux/kernel-features.h > +++ b/sysdeps/unix/sysv/linux/kernel-features.h > @@ -214,4 +214,12 @@ > # define __ASSUME_WAITID_PID0_P_PGID > #endif > > +/* The faccessat2 system call was introduced across all architectures > + in Linux 5.8. */ > +#if __LINUX_KERNEL_VERSION >= 0x050800 > +# define __ASSUME_FACCESSAT2 1 > +#else > +# define __ASSUME_FACCESSAT2 0 > +#endif > + > #endif /* kernel-features.h */ > Ok.
diff --git a/sysdeps/unix/sysv/linux/faccessat.c b/sysdeps/unix/sysv/linux/faccessat.c index e4f18ab2db..56cb6dcc8b 100644 --- a/sysdeps/unix/sysv/linux/faccessat.c +++ b/sysdeps/unix/sysv/linux/faccessat.c @@ -30,6 +30,13 @@ int faccessat (int fd, const char *file, int mode, int flag) { + int ret = INLINE_SYSCALL_CALL (faccessat2, fd, file, mode, flag); +#if __ASSUME_FACCESSAT2 + return ret; +#else + if (ret == 0 || errno != ENOSYS) + return ret; + if (flag & ~(AT_SYMLINK_NOFOLLOW | AT_EACCESS)) return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); @@ -41,9 +48,9 @@ faccessat (int fd, const char *file, int mode, int flag) return -1; mode &= (X_OK | W_OK | R_OK); /* Clear any bogus bits. */ -#if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH -# error Oops, portability assumptions incorrect. -#endif +# if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH +# error Oops, portability assumptions incorrect. +# endif if (mode == F_OK) return 0; /* The file exists. */ @@ -68,4 +75,5 @@ faccessat (int fd, const char *file, int mode, int flag) return 0; return INLINE_SYSCALL_ERROR_RETURN_VALUE (EACCES); +#endif /* !__ASSUME_FACCESSAT2 */ } diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 32533e94cf..a6bbc3c94e 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -214,4 +214,12 @@ # define __ASSUME_WAITID_PID0_P_PGID #endif +/* The faccessat2 system call was introduced across all architectures + in Linux 5.8. */ +#if __LINUX_KERNEL_VERSION >= 0x050800 +# define __ASSUME_FACCESSAT2 1 +#else +# define __ASSUME_FACCESSAT2 0 +#endif + #endif /* kernel-features.h */