From 7d679f29aee9f56b07bd792e07b5b4e1ca2f3fa7 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 23 Aug 2023 11:50:37 +0200 Subject: [PATCH] libmount: fix statx() includes Using sys/stat.h and linux/stat is too tricky.h together. It seems better to rely on libc and use sys/stat.h only. Users affected by old libc must update to use recent util-linux. Fixes: https://github.com/util-linux/util-linux/issues/2448 Signed-off-by: Karel Zak --- configure.ac | 5 ++--- include/fileutils.h | 4 ++-- libmount/src/hook_mount.c | 2 +- libmount/src/utils.c | 2 +- meson.build | 5 ++--- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 738b369ee8..e6114aac36 100644 --- a/configure.ac +++ b/configure.ac @@ -326,7 +326,6 @@ AC_CHECK_HEADERS([ \ linux/nsfs.h \ linux/pr.h \ linux/raw.h \ - linux/stat.h \ linux/securebits.h \ linux/tiocl.h \ linux/version.h \ @@ -518,7 +517,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]) AC_CHECK_TYPES([struct mount_attr], [], [], [[#include ]]) -AC_CHECK_TYPES([struct statx], [], [], [[#include ]]) AC_CHECK_TYPES([enum fsconfig_command], [], [], [[#include ]]) AC_CHECK_MEMBERS([struct termios.c_line],,, @@ -527,8 +525,9 @@ AC_CHECK_MEMBERS([struct termios.c_line],,, AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec],,, [[#include ]]) +AC_CHECK_TYPES([struct statx], [], [], [[#include ]]) AC_CHECK_MEMBERS([struct statx.stx_mnt_id],,, - [[#include ]]) + [[#include ]]) AC_CHECK_DECLS([_NL_TIME_WEEK_1STDAY],[],[],[[#include ]]) diff --git a/include/fileutils.h b/include/fileutils.h index a5fe517266..538eab0b74 100644 --- a/include/fileutils.h +++ b/include/fileutils.h @@ -94,13 +94,13 @@ static inline int close_range(unsigned int first, unsigned int last, int flags) # define HAVE_CLOSE_RANGE 1 # endif /* SYS_close_range */ -# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx) && defined(HAVE_LINUX_STAT_H) -# include +# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx) static inline int statx(int fd, const char *restrict path, int flags, unsigned int mask, struct statx *stx) { return syscall(SYS_statx, fd, path, flags, mask, stx); } +# define HAVE_STATX 1 # endif /* SYS_statx */ #endif /* HAVE_SYS_SYSCALL_H */ diff --git a/libmount/src/hook_mount.c b/libmount/src/hook_mount.c index 056338c491..0ebb829985 100644 --- a/libmount/src/hook_mount.c +++ b/libmount/src/hook_mount.c @@ -294,7 +294,7 @@ static int hook_create_mount(struct libmnt_context *cxt, /* cleanup after fail (libmount may only try the FS type) */ close_sysapi_fds(api); -#if defined(HAVE_STRUCT_STATX) && defined(HAVE_STRUCT_STATX_STX_MNT_ID) +#if defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(HAVE_STRUCT_STATX_STX_MNT_ID) if (!rc && cxt->fs) { struct statx st; diff --git a/libmount/src/utils.c b/libmount/src/utils.c index 1d3f4abcec..3817b39271 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -111,7 +111,7 @@ static int safe_stat(const char *target, struct stat *st, int nofollow) memset(st, 0, sizeof(struct stat)); -#if defined(AT_STATX_DONT_SYNC) && defined (HAVE_STRUCT_STATX) +#if defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(AT_STATX_DONT_SYNC) { int rc; struct statx stx = { 0 }; diff --git a/meson.build b/meson.build index 221ae373b6..6beb9dbaba 100644 --- a/meson.build +++ b/meson.build @@ -79,7 +79,7 @@ have_mountfd_api = cc.sizeof('struct mount_attr', prefix : '#include ') > 0 +have_struct_statx = cc.sizeof('struct statx', prefix : '#include ') > 0 conf.set('HAVE_STRUCT_STATX', have_struct_statx ? 1 : false) build_libmount = not get_option('build-libmount').disabled() @@ -177,7 +177,6 @@ headers = ''' linux/nsfs.h linux/mount.h linux/pr.h - linux/stat.h linux/securebits.h linux/tiocl.h linux/version.h @@ -640,7 +639,7 @@ have = cc.has_member('struct stat', 'st_mtim.tv_nsec', conf.set('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC', have ? 1 : false) have = cc.has_member('struct statx', 'stx_mnt_id', - prefix : '#include ') + prefix : '#include ') conf.set('HAVE_STRUCT_STATX_STX_MNT_ID', have ? 1 : false) # replacement for AC_STRUCT_TIMEZONE -- 2.39.2