[PATCH] vfs: ensure mount source is set to "none" if empty string specified

From: Prakash Sangappa
Date: Thu Jul 11 2024 - 16:11:48 EST


Due to changes from commit 0f89589a8c6f1033cb847a606517998efb0da8ee
mount source devname is no longer getting set to 'none' if an empty
source string is passed. Therefore /proc/<PID>/mountinfo will have a
empty string for source devname instead of 'none'.

This is due to following change in this commit
in vfs_parse_fs_string()

- if (v_size > 0) {
+ if (value) {
param.string = kmemdup_nul(value, v_size, GFP_KERNEL);
if (!param.string)
return -ENOMEM;
+ param.type = fs_value_is_string;
}

That results in fc->source, which is copied from param.string, to point
to an empty string instead of it being NULL. So, alloc_vfsmnt() called
from vfs_create_mount() would be passed the empty string in fc->source
not 'none'.

This patch fix checks if fc->source is an empty string in the call to
alloc_vfsmnt() and passes 'none'.

The issue can be easily reproduced.
#mount -t tmpfs "" /tmp/tdir
#grep "/tmp/tdir" /proc/$$/mountinfo

With the fix
506 103 0:48 / /tmp/tdir rw,relatime shared:268 - tmpfs none rw,...

Without the fix
506 103 0:48 / /tmp/tdir rw,relatime shared:268 - tmpfs rw,...

Signed-off-by: Prakash Sangappa <prakash.sangappa@xxxxxxxxxx>
---
fs/namespace.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/namespace.c b/fs/namespace.c
index 5a51315..409b48c 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1100,7 +1100,8 @@ struct vfsmount *vfs_create_mount(struct fs_context *fc)
if (!fc->root)
return ERR_PTR(-EINVAL);

- mnt = alloc_vfsmnt(fc->source ?: "none");
+ mnt = alloc_vfsmnt(fc->source && strlen(fc->source) > 0 ?
+ fc->source : "none");
if (!mnt)
return ERR_PTR(-ENOMEM);

--
2.7.4