Skip to content

Commit 0a77715

Browse files
committed
ksmbd: fix slab-use-after-free in ksmbd_smb2_session_create
There is a race condition between ksmbd_smb2_session_create and ksmbd_expire_session. This patch add missing sessions_table_lock while adding/deleting session from global session table. Cc: [email protected] # v5.15+ Reported-by: Norbert Szetei <[email protected]> Tested-by: Norbert Szetei <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 3abab90 commit 0a77715

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

fs/smb/server/mgmt/user_session.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
178178
unsigned long id;
179179
struct ksmbd_session *sess;
180180

181+
down_write(&sessions_table_lock);
181182
down_write(&conn->session_lock);
182183
xa_for_each(&conn->sessions, id, sess) {
183184
if (atomic_read(&sess->refcnt) == 0 &&
@@ -191,6 +192,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
191192
}
192193
}
193194
up_write(&conn->session_lock);
195+
up_write(&sessions_table_lock);
194196
}
195197

196198
int ksmbd_session_register(struct ksmbd_conn *conn,
@@ -232,7 +234,6 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
232234
}
233235
}
234236
}
235-
up_write(&sessions_table_lock);
236237

237238
down_write(&conn->session_lock);
238239
xa_for_each(&conn->sessions, id, sess) {
@@ -252,6 +253,7 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
252253
}
253254
}
254255
up_write(&conn->session_lock);
256+
up_write(&sessions_table_lock);
255257
}
256258

257259
struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,

0 commit comments

Comments
 (0)