Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 252231
b: refs/heads/master
c: 37bb04e
h: refs/heads/master
i:
  252229: d70425c
  252227: 57d3069
  252223: 0c94654
v: v3
  • Loading branch information
Pavel Shilovsky authored and Steve French committed May 23, 2011
1 parent f5516aa commit b67ec85
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 35 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c02324a6ae6bd3e83533c59525111ffe03b7e791
refs/heads/master: 37bb04e5a091a5330faef0cc09930326672b7061
90 changes: 56 additions & 34 deletions trunk/fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -1642,24 +1642,33 @@ match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
return true;
}

static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
struct smb_vol *vol)
{
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
return 0;

if (!match_address(server, addr,
(struct sockaddr *)&vol->srcaddr))
return 0;

if (!match_port(server, addr))
return 0;

if (!match_security(server, vol))
return 0;

return 1;
}

static struct TCP_Server_Info *
cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
{
struct TCP_Server_Info *server;

spin_lock(&cifs_tcp_ses_lock);
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
continue;

if (!match_address(server, addr,
(struct sockaddr *)&vol->srcaddr))
continue;

if (!match_port(server, addr))
continue;

if (!match_security(server, vol))
if (!match_server(server, addr, vol))
continue;

++server->srv_count;
Expand Down Expand Up @@ -1853,32 +1862,39 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
return ERR_PTR(rc);
}

static int match_session(struct cifsSesInfo *ses, struct smb_vol *vol)
{
switch (ses->server->secType) {
case Kerberos:
if (vol->cred_uid != ses->cred_uid)
return 0;
break;
default:
/* anything else takes username/password */
if (ses->user_name == NULL)
return 0;
if (strncmp(ses->user_name, vol->username,
MAX_USERNAME_SIZE))
return 0;
if (strlen(vol->username) != 0 &&
ses->password != NULL &&
strncmp(ses->password,
vol->password ? vol->password : "",
MAX_PASSWORD_SIZE))
return 0;
}
return 1;
}

static struct cifsSesInfo *
cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
{
struct cifsSesInfo *ses;

spin_lock(&cifs_tcp_ses_lock);
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
switch (server->secType) {
case Kerberos:
if (vol->cred_uid != ses->cred_uid)
continue;
break;
default:
/* anything else takes username/password */
if (ses->user_name == NULL)
continue;
if (strncmp(ses->user_name, vol->username,
MAX_USERNAME_SIZE))
continue;
if (strlen(vol->username) != 0 &&
ses->password != NULL &&
strncmp(ses->password,
vol->password ? vol->password : "",
MAX_PASSWORD_SIZE))
continue;
}
if (!match_session(ses, vol))
continue;
++ses->ses_count;
spin_unlock(&cifs_tcp_ses_lock);
return ses;
Expand Down Expand Up @@ -2021,6 +2037,15 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
return ERR_PTR(rc);
}

static int match_tcon(struct cifsTconInfo *tcon, const char *unc)
{
if (tcon->tidStatus == CifsExiting)
return 0;
if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
return 0;
return 1;
}

static struct cifsTconInfo *
cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
{
Expand All @@ -2030,11 +2055,8 @@ cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
spin_lock(&cifs_tcp_ses_lock);
list_for_each(tmp, &ses->tcon_list) {
tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
if (tcon->tidStatus == CifsExiting)
if (!match_tcon(tcon, unc))
continue;
if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
continue;

++tcon->tc_count;
spin_unlock(&cifs_tcp_ses_lock);
return tcon;
Expand Down

0 comments on commit b67ec85

Please sign in to comment.