]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
mount_utils: add locked flag helpers
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 7 Feb 2021 15:19:36 +0000 (16:19 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 8 Feb 2021 08:53:34 +0000 (09:53 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
configure.ac
src/lxc/conf.c
src/lxc/conf.h
src/lxc/mount_utils.c
src/lxc/mount_utils.h
src/lxc/storage/dir.c

index 60d7a91e6b1070d630ae1c34962817380896e260..31176702e31eadec4e0369dfce2b3f0d80e88053 100644 (file)
@@ -644,7 +644,7 @@ AC_CHECK_HEADER([ifaddrs.h],
 AC_HEADER_MAJOR
 
 # Check for some syscalls functions
-AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create move_mount open_tree execveat clone3 fsopen fspick fsconfig fsmount, openat2, close_range])
+AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create move_mount open_tree execveat clone3 fsopen fspick fsconfig fsmount, openat2, close_range, statvfs])
 AC_CHECK_TYPES([struct open_how], [], [], [[#include <linux/openat2.h>]])
 AC_CHECK_TYPES([struct clone_args], [], [], [[#include <linux/sched.h>]])
 AC_CHECK_MEMBERS([struct clone_args.set_tid],[],[],[[#include <linux/sched.h>]])
@@ -684,7 +684,6 @@ fi
 
 # Check for some functions
 AC_CHECK_LIB(pthread, main)
-AC_CHECK_FUNCS(statvfs)
 AC_CHECK_LIB(util, openpty)
 AC_CHECK_FUNCS([hasmntopt setmntent endmntent utmpxname])
 AC_CHECK_FUNCS([getgrgid_r],
index 095c94bb0bf22b498eaacbea91df3d6ed6441df5..4fcb9f1021695112e4faa58d624ac68324fb81b7 100644 (file)
@@ -529,55 +529,6 @@ int pin_rootfs(const char *rootfs)
        return fd;
 }
 
-/* If we are asking to remount something, make sure that any NOEXEC etc are
- * honored.
- */
-unsigned long add_required_remount_flags(const char *s, const char *d,
-                                        unsigned long flags)
-{
-#ifdef HAVE_STATVFS
-       int ret;
-       struct statvfs sb;
-       unsigned long required_flags = 0;
-
-       if (!s)
-               s = d;
-
-       if (!s)
-               return flags;
-
-       ret = statvfs(s, &sb);
-       if (ret < 0)
-               return flags;
-
-       if (flags & MS_REMOUNT) {
-               if (sb.f_flag & MS_NOSUID)
-                       required_flags |= MS_NOSUID;
-               if (sb.f_flag & MS_NODEV)
-                       required_flags |= MS_NODEV;
-               if (sb.f_flag & MS_RDONLY)
-                       required_flags |= MS_RDONLY;
-               if (sb.f_flag & MS_NOEXEC)
-                       required_flags |= MS_NOEXEC;
-       }
-
-       if (sb.f_flag & MS_NOATIME)
-               required_flags |= MS_NOATIME;
-       if (sb.f_flag & MS_NODIRATIME)
-               required_flags |= MS_NODIRATIME;
-       if (sb.f_flag & MS_LAZYTIME)
-               required_flags |= MS_LAZYTIME;
-       if (sb.f_flag & MS_RELATIME)
-               required_flags |= MS_RELATIME;
-       if (sb.f_flag & MS_STRICTATIME)
-               required_flags |= MS_STRICTATIME;
-
-       return flags | required_flags;
-#else
-       return flags;
-#endif
-}
-
 static int add_shmount_to_list(struct lxc_conf *conf)
 {
        char new_mount[PATH_MAX];
index 9dae088e63821f6a09822d38ab15d467d2f8eb2c..489b955cdbafda066cb8b4441f520d6a57e8600f 100644 (file)
@@ -516,8 +516,6 @@ __hidden extern void turn_into_dependent_mounts(void);
 __hidden extern void suggest_default_idmap(void);
 __hidden extern FILE *make_anonymous_mount_file(struct lxc_list *mount, bool include_nesting_helpers);
 __hidden extern struct lxc_list *sort_cgroup_settings(struct lxc_list *cgroup_settings);
-__hidden extern unsigned long add_required_remount_flags(const char *s, const char *d,
-                                                        unsigned long flags);
 __hidden extern int run_script(const char *name, const char *section, const char *script, ...);
 __hidden extern int run_script_argv(const char *name, unsigned int hook_version, const char *section,
                                    const char *script, const char *hookname, char **argsin);
index c72a1d67734352b1c3385b0d41f4b11d67a8fd2b..78e50ecacd1aa6cb272e7800a0b9e53f4644b749 100644 (file)
@@ -11,6 +11,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include "file_utils.h"
 #include "log.h"
 #include "macro.h"
 #include "memory_utils.h"
 #include "syscall_numbers.h"
 #include "syscall_wrappers.h"
 
+#ifdef HAVE_STATVFS
+#include <sys/statvfs.h>
+#endif
+
 lxc_log_define(mount_utils, lxc);
 
 int mnt_attributes_new(unsigned int old_flags, unsigned int *new_flags)
@@ -284,3 +289,152 @@ int fd_bind_mount(int dfd_from, const char *path_from,
        TRACE("Attach detached mount %d to filesystem at %d", fd_tree_from, fd_to);
        return 0;
 }
+
+int calc_remount_flags_new(int dfd_from, const char *path_from,
+                          __u64 o_flags_from, __u64 resolve_flags_from,
+                          bool remount, unsigned long cur_flags,
+                          unsigned int *new_flags)
+{
+#ifdef HAVE_STATVFS
+       __do_close int fd_from = -EBADF;
+       unsigned int new_required_flags = 0;
+       int ret;
+       struct statvfs sb;
+
+       fd_from = open_at(dfd_from, path_from, o_flags_from, resolve_flags_from, 0);
+       if (fd_from < 0)
+               return log_error_errno(-errno, errno, "Failed to open %d(%s)", dfd_from, maybe_empty(path_from));
+
+       ret = fstatvfs(dfd_from, &sb);
+       if (ret < 0)
+               return log_error_errno(-errno, errno, "Failed to retrieve mount information from %d(%s)", fd_from, maybe_empty(path_from));
+
+       if (remount) {
+               if (sb.f_flag & MS_NOSUID)
+                       new_required_flags |= MOUNT_ATTR_NOSUID;
+
+               if (sb.f_flag & MS_NODEV)
+                       new_required_flags |= MOUNT_ATTR_NODEV;
+
+               if (sb.f_flag & MS_RDONLY)
+                       new_required_flags |= MOUNT_ATTR_RDONLY;
+
+               if (sb.f_flag & MS_NOEXEC)
+                       new_required_flags |= MOUNT_ATTR_NOEXEC;
+       }
+
+       if (sb.f_flag & MS_NOATIME)
+               new_required_flags |= MOUNT_ATTR_NOATIME;
+
+       if (sb.f_flag & MS_NODIRATIME)
+               new_required_flags |= MOUNT_ATTR_NODIRATIME;
+
+       if (sb.f_flag & MS_RELATIME)
+               new_required_flags |= MOUNT_ATTR_RELATIME;
+
+       if (sb.f_flag & MS_STRICTATIME)
+               new_required_flags |= MOUNT_ATTR_STRICTATIME;
+
+       *new_flags = (cur_flags | new_required_flags);
+#endif
+       return 0;
+}
+
+int calc_remount_flags_old(int dfd_from, const char *path_from,
+                          __u64 o_flags_from, __u64 resolve_flags_from,
+                          bool remount, unsigned long cur_flags,
+                          unsigned int *old_flags)
+{
+#ifdef HAVE_STATVFS
+       __do_close int fd_from = -EBADF;
+       unsigned int old_required_flags = 0;
+       int ret;
+       struct statvfs sb;
+
+       fd_from = open_at(dfd_from, path_from, o_flags_from, resolve_flags_from, 0);
+       if (fd_from < 0)
+               return log_error_errno(-errno, errno, "Failed to open %d(%s)", dfd_from, maybe_empty(path_from));
+
+       ret = fstatvfs(dfd_from, &sb);
+       if (ret < 0)
+               return log_error_errno(-errno, errno, "Failed to retrieve mount information from %d(%s)", fd_from, maybe_empty(path_from));
+
+       if (remount) {
+               if (sb.f_flag & MS_NOSUID)
+                       old_required_flags |= MS_NOSUID;
+
+               if (sb.f_flag & MS_NODEV)
+                       old_required_flags |= MS_NODEV;
+
+               if (sb.f_flag & MS_RDONLY)
+                       old_required_flags |= MS_RDONLY;
+
+               if (sb.f_flag & MS_NOEXEC)
+                       old_required_flags |= MS_NOEXEC;
+       }
+
+       if (sb.f_flag & MS_NOATIME)
+               old_required_flags |= MS_NOATIME;
+
+       if (sb.f_flag & MS_NODIRATIME)
+               old_required_flags |= MS_NODIRATIME;
+
+       if (sb.f_flag & MS_RELATIME)
+               old_required_flags |= MS_RELATIME;
+
+       if (sb.f_flag & MS_STRICTATIME)
+               old_required_flags |= MS_STRICTATIME;
+
+       *old_flags = (cur_flags | old_required_flags);
+#endif
+       return 0;
+}
+
+/* If we are asking to remount something, make sure that any NOEXEC etc are
+ * honored.
+ */
+unsigned long add_required_remount_flags(const char *s, const char *d,
+                                        unsigned long flags)
+{
+#ifdef HAVE_STATVFS
+       int ret;
+       struct statvfs sb;
+       unsigned long required_flags = 0;
+
+       if (!s)
+               s = d;
+
+       if (!s)
+               return flags;
+
+       ret = statvfs(s, &sb);
+       if (ret < 0)
+               return flags;
+
+       if (flags & MS_REMOUNT) {
+               if (sb.f_flag & MS_NOSUID)
+                       required_flags |= MS_NOSUID;
+               if (sb.f_flag & MS_NODEV)
+                       required_flags |= MS_NODEV;
+               if (sb.f_flag & MS_RDONLY)
+                       required_flags |= MS_RDONLY;
+               if (sb.f_flag & MS_NOEXEC)
+                       required_flags |= MS_NOEXEC;
+       }
+
+       if (sb.f_flag & MS_NOATIME)
+               required_flags |= MS_NOATIME;
+       if (sb.f_flag & MS_NODIRATIME)
+               required_flags |= MS_NODIRATIME;
+       if (sb.f_flag & MS_LAZYTIME)
+               required_flags |= MS_LAZYTIME;
+       if (sb.f_flag & MS_RELATIME)
+               required_flags |= MS_RELATIME;
+       if (sb.f_flag & MS_STRICTATIME)
+               required_flags |= MS_STRICTATIME;
+
+       return flags | required_flags;
+#else
+       return flags;
+#endif
+}
index 54c941e13274ea1c25bb2a9cd725ba2d9bac0328..9e28eccf4e2587f0d43be99053b1f2a76df04b45 100644 (file)
@@ -207,4 +207,20 @@ static inline bool new_mount_api(void)
        return supported == 1;
 }
 
+__hidden extern int calc_remount_flags_new(int dfd_from, const char *path_from,
+                                          __u64 o_flags_from,
+                                          __u64 resolve_flags_from,
+                                          bool remount, unsigned long cur_flags,
+                                          unsigned int *new_flags);
+
+__hidden extern int calc_remount_flags_old(int dfd_from, const char *path_from,
+                                          __u64 o_flags_from,
+                                          __u64 resolve_flags_from,
+                                          bool remount, unsigned long cur_flags,
+                                          unsigned int *old_flags);
+
+__hidden extern unsigned long add_required_remount_flags(const char *s,
+                                                        const char *d,
+                                                        unsigned long flags);
+
 #endif /* __LXC_MOUNT_UTILS_H */
index 18a10a42f9dfe43460c8374cea19fc1a4a1aab78..c1ec5d17dc5f9d04ec2f79229621c6319498ea01 100644 (file)
@@ -11,6 +11,7 @@
 #include "log.h"
 #include "macro.h"
 #include "memory_utils.h"
+#include "mount_utils.h"
 #include "storage.h"
 #include "utils.h"