cifs: correctly handle NULL tcon pointer in CIFSTCon
Long ago (in commit 00e485b0), I added some code to handle share-level passwords in CIFSTCon. That code ignored the fact that it's legit to pass in a NULL tcon pointer when connecting to the IPC$ share on the server. This wasn't really a problem until recently as we only called CIFSTCon this way when the server returned -EREMOTE. With the introduction of commit c1508ca2 however, it gets called this way on every mount, causing an oops when share-level security is in effect. Fix this by simply treating a NULL tcon pointer as if user-level security were in effect. I'm not aware of any servers that protect the IPC$ share with a specific password anyway. Also, add a comment to the top of CIFSTCon to ensure that we don't make the same mistake again. Cc: <stable@kernel.org> Reported-by: Martijn Uffing <mp3project@sarijopen.student.utwente.nl> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
3e71551364
commit
8d1bca328b
@ -3174,6 +3174,10 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
|
||||||
|
* pointer may be NULL.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
CIFSTCon(unsigned int xid, struct cifs_ses *ses,
|
CIFSTCon(unsigned int xid, struct cifs_ses *ses,
|
||||||
const char *tree, struct cifs_tcon *tcon,
|
const char *tree, struct cifs_tcon *tcon,
|
||||||
@ -3208,7 +3212,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses,
|
|||||||
pSMB->AndXCommand = 0xFF;
|
pSMB->AndXCommand = 0xFF;
|
||||||
pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
|
pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
|
||||||
bcc_ptr = &pSMB->Password[0];
|
bcc_ptr = &pSMB->Password[0];
|
||||||
if ((ses->server->sec_mode) & SECMODE_USER) {
|
if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
|
||||||
pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
|
pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
|
||||||
*bcc_ptr = 0; /* password is null byte */
|
*bcc_ptr = 0; /* password is null byte */
|
||||||
bcc_ptr++; /* skip password */
|
bcc_ptr++; /* skip password */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user