|
@@ -1644,17 +1644,27 @@ out_err:
|
|
|
}
|
|
|
|
|
|
static struct cifsSesInfo *
|
|
|
-cifs_find_smb_ses(struct TCP_Server_Info *server, char *username)
|
|
|
+cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
|
|
|
{
|
|
|
- struct list_head *tmp;
|
|
|
struct cifsSesInfo *ses;
|
|
|
|
|
|
write_lock(&cifs_tcp_ses_lock);
|
|
|
- list_for_each(tmp, &server->smb_ses_list) {
|
|
|
- ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
|
|
|
- if (strncmp(ses->userName, username, MAX_USERNAME_SIZE))
|
|
|
- continue;
|
|
|
-
|
|
|
+ list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
|
|
+ switch (server->secType) {
|
|
|
+ case Kerberos:
|
|
|
+ if (vol->linux_uid != ses->linux_uid)
|
|
|
+ continue;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* anything else takes username/password */
|
|
|
+ if (strncmp(ses->userName, vol->username,
|
|
|
+ MAX_USERNAME_SIZE))
|
|
|
+ continue;
|
|
|
+ if (strlen(vol->username) != 0 &&
|
|
|
+ strncmp(ses->password, vol->password,
|
|
|
+ MAX_PASSWORD_SIZE))
|
|
|
+ continue;
|
|
|
+ }
|
|
|
++ses->ses_count;
|
|
|
write_unlock(&cifs_tcp_ses_lock);
|
|
|
return ses;
|
|
@@ -1696,7 +1706,7 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
|
|
|
|
|
|
xid = GetXid();
|
|
|
|
|
|
- ses = cifs_find_smb_ses(server, volume_info->username);
|
|
|
+ ses = cifs_find_smb_ses(server, volume_info);
|
|
|
if (ses) {
|
|
|
cFYI(1, "Existing smb sess found (status=%d)", ses->status);
|
|
|
|