Commit 00806087 authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French
Browse files

ksmbd: fix missing chann_lock while iterating session channel list



Add chann_lock while iterating ksmbd_chann_list in show_proc_session() and
show_proc_sessions(). This will prevents a race condition with concurrent
channel list modifications.

Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 4f3a06cc
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ static int show_proc_session(struct seq_file *m, void *v)
	ksmbd_user_session_get(sess);

	i = 0;
	down_read(&sess->chann_lock);
	xa_for_each(&sess->ksmbd_chann_list, id, chan) {
#if IS_ENABLED(CONFIG_IPV6)
		if (chan->conn->inet_addr)
@@ -129,6 +130,7 @@ static int show_proc_session(struct seq_file *m, void *v)
		}
		i++;
	}
	up_read(&sess->chann_lock);

	seq_printf(m, "%-20s\t%d\n", "channels", i);

@@ -205,6 +207,7 @@ static int show_proc_sessions(struct seq_file *m, void *v)

	down_read(&sessions_table_lock);
	hash_for_each(sessions_table, i, session, hlist) {
		down_read(&session->chann_lock);
		xa_for_each(&session->ksmbd_chann_list, id, chan) {
			down_read(&chan->conn->session_lock);
			ksmbd_user_session_get(session);
@@ -221,6 +224,7 @@ static int show_proc_sessions(struct seq_file *m, void *v)
			ksmbd_user_session_put(session);
			up_read(&chan->conn->session_lock);
		}
		up_read(&session->chann_lock);
	}
	up_read(&sessions_table_lock);
	return 0;