Skip to content

Commit 0080608

Browse files
namjaejeonsmfrench
authored andcommitted
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: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 4f3a06c commit 0080608

1 file changed

Lines changed: 19 additions & 15 deletions

File tree

fs/smb/server/mgmt/user_session.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ static int show_proc_session(struct seq_file *m, void *v)
9191
ksmbd_user_session_get(sess);
9292

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

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

@@ -205,22 +207,24 @@ static int show_proc_sessions(struct seq_file *m, void *v)
205207

206208
down_read(&sessions_table_lock);
207209
hash_for_each(sessions_table, i, session, hlist) {
210+
down_read(&session->chann_lock);
208211
xa_for_each(&session->ksmbd_chann_list, id, chan) {
209-
down_read(&chan->conn->session_lock);
210-
ksmbd_user_session_get(session);
211-
212-
if (chan->conn->inet_addr)
213-
seq_printf(m, " %-40pI4", &chan->conn->inet_addr);
214-
else
215-
seq_printf(m, " %-40pI6c", &chan->conn->inet6_addr);
216-
seq_printf(m, " %-15s %-10llu %-10s\n",
217-
session_user_name(session),
218-
session->id,
219-
session_state_string(session));
220-
221-
ksmbd_user_session_put(session);
222-
up_read(&chan->conn->session_lock);
223-
}
212+
down_read(&chan->conn->session_lock);
213+
ksmbd_user_session_get(session);
214+
215+
if (chan->conn->inet_addr)
216+
seq_printf(m, " %-40pI4", &chan->conn->inet_addr);
217+
else
218+
seq_printf(m, " %-40pI6c", &chan->conn->inet6_addr);
219+
seq_printf(m, " %-15s %-10llu %-10s\n",
220+
session_user_name(session),
221+
session->id,
222+
session_state_string(session));
223+
224+
ksmbd_user_session_put(session);
225+
up_read(&chan->conn->session_lock);
226+
}
227+
up_read(&session->chann_lock);
224228
}
225229
up_read(&sessions_table_lock);
226230
return 0;

0 commit comments

Comments
 (0)