On 6/3/26 14:32, Vasileios Almpanis wrote:
In legacy mount callpaths, userspace might pass mount options as
flags. These flags escape our checks in ve_devmnt_process allowing
devices to be mounted inside containers with options not specified in
...
+/*
+ * For legacy mount(2), MS_* mount flags are folded into fc->sb_flags and are
+ * not present in the monolithic data string.  Build a page with user data
+ * followed by those flags for ve_devmnt checks in vfs_parse_monolithic_sep.
+ *
+ * Returns @data when nothing needs to be added, a new page otherwise, or
+ * ERR_PTR() on failure.  The caller must free_page() when the result != @data.
+ */
+void *legacy_merge_mount_data(struct fs_context *fc, void *data)
+{
+       struct ve_struct *ve = get_exec_env();
+       size_t off = 0;
+       char *page;
+       int err;
+
+       if (ve_is_super(ve))
+               return data;
+
+       if (!fc->fs_type || !(fc->fs_type->fs_flags & FS_REQUIRES_DEV))
+               return data;
+
+       /*
+        * Filesystems with binary mount data (e.g. btrfs) bypass option
+        * string parsing entirely, so our checks cannot apply here.
+        */
+       if (fc->fs_type->fs_flags & FS_BINARY_MOUNTDATA)
+               return data;
+
+       page = (char *)__get_free_page(GFP_KERNEL);
+       if (!page)
+               return ERR_PTR(-ENOMEM);
+
+       if (data && *(char *)data) {
+               ssize_t ret = strscpy(page, data, PAGE_SIZE);
+
+               if (ret < 0) {
+                       err = -E2BIG;
+                       goto err_free;
+               }
+               off = ret;
+       }
+
+       err = vfs_format_sb_flags(fc, page, PAGE_SIZE, &off);
+       if (err)
+               goto err_free;
+
+       if (!off) {

Let's drop this check. It happens only when data is empty and no flags provided.
And it doesn't add any value - we just free page a little bit earlier.

Everything else looks good.

+               free_page((unsigned long)page);
+               return data;
+       }
+
+       return page;
+
+err_free:
+       free_page((unsigned long)page);
+       return ERR_PTR(err);
+}
...

--
Best regards, Riabchun Vladimir
Linux Kernel Developer, Virtuozzo

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to