File tree Expand file tree Collapse file tree 3 files changed +22
-8
lines changed Expand file tree Collapse file tree 3 files changed +22
-8
lines changed Original file line number Diff line number Diff line change @@ -259,6 +259,22 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
259
259
up_write (& sessions_table_lock );
260
260
}
261
261
262
+ bool is_ksmbd_session_in_connection (struct ksmbd_conn * conn ,
263
+ unsigned long long id )
264
+ {
265
+ struct ksmbd_session * sess ;
266
+
267
+ down_read (& conn -> session_lock );
268
+ sess = xa_load (& conn -> sessions , id );
269
+ if (sess ) {
270
+ up_read (& conn -> session_lock );
271
+ return true;
272
+ }
273
+ up_read (& conn -> session_lock );
274
+
275
+ return false;
276
+ }
277
+
262
278
struct ksmbd_session * ksmbd_session_lookup (struct ksmbd_conn * conn ,
263
279
unsigned long long id )
264
280
{
Original file line number Diff line number Diff line change @@ -87,6 +87,8 @@ void ksmbd_session_destroy(struct ksmbd_session *sess);
87
87
struct ksmbd_session * ksmbd_session_lookup_slowpath (unsigned long long id );
88
88
struct ksmbd_session * ksmbd_session_lookup (struct ksmbd_conn * conn ,
89
89
unsigned long long id );
90
+ bool is_ksmbd_session_in_connection (struct ksmbd_conn * conn ,
91
+ unsigned long long id );
90
92
int ksmbd_session_register (struct ksmbd_conn * conn ,
91
93
struct ksmbd_session * sess );
92
94
void ksmbd_sessions_deregister (struct ksmbd_conn * conn );
Original file line number Diff line number Diff line change @@ -1707,44 +1707,38 @@ int smb2_sess_setup(struct ksmbd_work *work)
1707
1707
1708
1708
if (conn -> dialect != sess -> dialect ) {
1709
1709
rc = - EINVAL ;
1710
- ksmbd_user_session_put (sess );
1711
1710
goto out_err ;
1712
1711
}
1713
1712
1714
1713
if (!(req -> hdr .Flags & SMB2_FLAGS_SIGNED )) {
1715
1714
rc = - EINVAL ;
1716
- ksmbd_user_session_put (sess );
1717
1715
goto out_err ;
1718
1716
}
1719
1717
1720
1718
if (strncmp (conn -> ClientGUID , sess -> ClientGUID ,
1721
1719
SMB2_CLIENT_GUID_SIZE )) {
1722
1720
rc = - ENOENT ;
1723
- ksmbd_user_session_put (sess );
1724
1721
goto out_err ;
1725
1722
}
1726
1723
1727
1724
if (sess -> state == SMB2_SESSION_IN_PROGRESS ) {
1728
1725
rc = - EACCES ;
1729
- ksmbd_user_session_put (sess );
1730
1726
goto out_err ;
1731
1727
}
1732
1728
1733
1729
if (sess -> state == SMB2_SESSION_EXPIRED ) {
1734
1730
rc = - EFAULT ;
1735
- ksmbd_user_session_put (sess );
1736
1731
goto out_err ;
1737
1732
}
1738
- ksmbd_user_session_put (sess );
1739
1733
1740
1734
if (ksmbd_conn_need_reconnect (conn )) {
1741
1735
rc = - EFAULT ;
1736
+ ksmbd_user_session_put (sess );
1742
1737
sess = NULL ;
1743
1738
goto out_err ;
1744
1739
}
1745
1740
1746
- sess = ksmbd_session_lookup (conn , sess_id );
1747
- if (!sess ) {
1741
+ if (is_ksmbd_session_in_connection (conn , sess_id )) {
1748
1742
rc = - EACCES ;
1749
1743
goto out_err ;
1750
1744
}
@@ -1910,6 +1904,8 @@ int smb2_sess_setup(struct ksmbd_work *work)
1910
1904
1911
1905
sess -> last_active = jiffies ;
1912
1906
sess -> state = SMB2_SESSION_EXPIRED ;
1907
+ ksmbd_user_session_put (sess );
1908
+ work -> sess = NULL ;
1913
1909
if (try_delay ) {
1914
1910
ksmbd_conn_set_need_reconnect (conn );
1915
1911
ssleep (5 );
You can’t perform that action at this time.
0 commit comments