summaryrefslogtreecommitdiffstats
path: root/fs/namespace.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@kernel.org>2024-11-11 16:09:55 +0100
committerChristian Brauner <brauner@kernel.org>2024-11-12 14:37:12 +0100
commit75ead69a717332efa70303fba85e1876793c74a9 (patch)
treef5908057df9002e0bbc28a5747655ce7a979739e /fs/namespace.c
parentfs:aio: Remove TODO comment suggesting hash or array usage in io_cancel() (diff)
downloadlinux-75ead69a717332efa70303fba85e1876793c74a9.tar.xz
linux-75ead69a717332efa70303fba85e1876793c74a9.zip
fs: don't let statmount return empty strings
When one of the statmount_string() handlers doesn't emit anything to seq, the kernel currently sets the corresponding flag and emits an empty string. Given that statmount() returns a mask of accessible fields, just leave the bit unset in this case, and skip any NULL termination. If nothing was emitted to the seq, then the EOVERFLOW and EAGAIN cases aren't applicable and the function can just return immediately. Signed-off-by: Jeff Layton <jlayton@kernel.org> Link: https://lore.kernel.org/r/20241111-statmount-v4-1-2eaf35d07a80@kernel.org Acked-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/namespace.c')
-rw-r--r--fs/namespace.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 9a3c251d033d..23187a414754 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -5044,22 +5044,23 @@ static int statmount_string(struct kstatmount *s, u64 flag)
size_t kbufsize;
struct seq_file *seq = &s->seq;
struct statmount *sm = &s->sm;
+ u32 start = seq->count;
switch (flag) {
case STATMOUNT_FS_TYPE:
- sm->fs_type = seq->count;
+ sm->fs_type = start;
ret = statmount_fs_type(s, seq);
break;
case STATMOUNT_MNT_ROOT:
- sm->mnt_root = seq->count;
+ sm->mnt_root = start;
ret = statmount_mnt_root(s, seq);
break;
case STATMOUNT_MNT_POINT:
- sm->mnt_point = seq->count;
+ sm->mnt_point = start;
ret = statmount_mnt_point(s, seq);
break;
case STATMOUNT_MNT_OPTS:
- sm->mnt_opts = seq->count;
+ sm->mnt_opts = start;
ret = statmount_mnt_opts(s, seq);
break;
default:
@@ -5067,6 +5068,12 @@ static int statmount_string(struct kstatmount *s, u64 flag)
return -EINVAL;
}
+ /*
+ * If nothing was emitted, return to avoid setting the flag
+ * and terminating the buffer.
+ */
+ if (seq->count == start)
+ return ret;
if (unlikely(check_add_overflow(sizeof(*sm), seq->count, &kbufsize)))
return -EOVERFLOW;
if (kbufsize >= s->bufsize)