Unverified Commit 75ead69a authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner
Browse files

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: default avatarJeff Layton <jlayton@kernel.org>
Link: https://lore.kernel.org/r/20241111-statmount-v4-1-2eaf35d07a80@kernel.org


Acked-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent c4d7d907
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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)