@@ -67,8 +67,10 @@ static inline bool check_session_id(struct ksmbd_conn *conn, u64 id)
6767 return false;
6868
6969 sess = ksmbd_session_lookup_all (conn , id );
70- if (sess )
70+ if (sess ) {
71+ ksmbd_user_session_put (sess );
7172 return true;
73+ }
7274 pr_err ("Invalid user session id: %llu\n" , id );
7375 return false;
7476}
@@ -605,10 +607,8 @@ int smb2_check_user_session(struct ksmbd_work *work)
605607
606608 /* Check for validity of user session */
607609 work -> sess = ksmbd_session_lookup_all (conn , sess_id );
608- if (work -> sess ) {
609- ksmbd_user_session_get (work -> sess );
610+ if (work -> sess )
610611 return 1 ;
611- }
612612 ksmbd_debug (SMB , "Invalid user session, Uid %llu\n" , sess_id );
613613 return - ENOENT ;
614614}
@@ -1701,37 +1701,44 @@ int smb2_sess_setup(struct ksmbd_work *work)
17011701
17021702 if (conn -> dialect != sess -> dialect ) {
17031703 rc = - EINVAL ;
1704+ ksmbd_user_session_put (sess );
17041705 goto out_err ;
17051706 }
17061707
17071708 if (!(req -> hdr .Flags & SMB2_FLAGS_SIGNED )) {
17081709 rc = - EINVAL ;
1710+ ksmbd_user_session_put (sess );
17091711 goto out_err ;
17101712 }
17111713
17121714 if (strncmp (conn -> ClientGUID , sess -> ClientGUID ,
17131715 SMB2_CLIENT_GUID_SIZE )) {
17141716 rc = - ENOENT ;
1717+ ksmbd_user_session_put (sess );
17151718 goto out_err ;
17161719 }
17171720
17181721 if (sess -> state == SMB2_SESSION_IN_PROGRESS ) {
17191722 rc = - EACCES ;
1723+ ksmbd_user_session_put (sess );
17201724 goto out_err ;
17211725 }
17221726
17231727 if (sess -> state == SMB2_SESSION_EXPIRED ) {
17241728 rc = - EFAULT ;
1729+ ksmbd_user_session_put (sess );
17251730 goto out_err ;
17261731 }
1732+ ksmbd_user_session_put (sess );
17271733
17281734 if (ksmbd_conn_need_reconnect (conn )) {
17291735 rc = - EFAULT ;
17301736 sess = NULL ;
17311737 goto out_err ;
17321738 }
17331739
1734- if (ksmbd_session_lookup (conn , sess_id )) {
1740+ sess = ksmbd_session_lookup (conn , sess_id );
1741+ if (!sess ) {
17351742 rc = - EACCES ;
17361743 goto out_err ;
17371744 }
@@ -1742,7 +1749,6 @@ int smb2_sess_setup(struct ksmbd_work *work)
17421749 }
17431750
17441751 conn -> binding = true;
1745- ksmbd_user_session_get (sess );
17461752 } else if ((conn -> dialect < SMB30_PROT_ID ||
17471753 server_conf .flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) &&
17481754 (req -> Flags & SMB2_SESSION_REQ_FLAG_BINDING )) {
@@ -1769,7 +1775,6 @@ int smb2_sess_setup(struct ksmbd_work *work)
17691775 }
17701776
17711777 conn -> binding = false;
1772- ksmbd_user_session_get (sess );
17731778 }
17741779 work -> sess = sess ;
17751780
@@ -2197,9 +2202,9 @@ int smb2_tree_disconnect(struct ksmbd_work *work)
21972202int smb2_session_logoff (struct ksmbd_work * work )
21982203{
21992204 struct ksmbd_conn * conn = work -> conn ;
2205+ struct ksmbd_session * sess = work -> sess ;
22002206 struct smb2_logoff_req * req ;
22012207 struct smb2_logoff_rsp * rsp ;
2202- struct ksmbd_session * sess ;
22032208 u64 sess_id ;
22042209 int err ;
22052210
@@ -2221,11 +2226,6 @@ int smb2_session_logoff(struct ksmbd_work *work)
22212226 ksmbd_close_session_fds (work );
22222227 ksmbd_conn_wait_idle (conn );
22232228
2224- /*
2225- * Re-lookup session to validate if session is deleted
2226- * while waiting request complete
2227- */
2228- sess = ksmbd_session_lookup_all (conn , sess_id );
22292229 if (ksmbd_tree_conn_session_logoff (sess )) {
22302230 ksmbd_debug (SMB , "Invalid tid %d\n" , req -> hdr .Id .SyncId .TreeId );
22312231 rsp -> hdr .Status = STATUS_NETWORK_NAME_DELETED ;
@@ -8992,6 +8992,7 @@ int smb3_decrypt_req(struct ksmbd_work *work)
89928992 le64_to_cpu (tr_hdr -> SessionId ));
89938993 return - ECONNABORTED ;
89948994 }
8995+ ksmbd_user_session_put (sess );
89958996
89968997 iov [0 ].iov_base = buf ;
89978998 iov [0 ].iov_len = sizeof (struct smb2_transform_hdr ) + 4 ;
0 commit comments