aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/cifsglob.h4
-rw-r--r--fs/cifs/cifssmb.c15
-rw-r--r--fs/cifs/smb2pdu.c2
3 files changed, 16 insertions, 5 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 9f8dc3da5f3b..82ba4b974894 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -541,6 +541,10 @@ struct TCP_Server_Info {
541 struct session_key session_key; 541 struct session_key session_key;
542 unsigned long lstrp; /* when we got last response from this server */ 542 unsigned long lstrp; /* when we got last response from this server */
543 struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */ 543 struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
544#define CIFS_NEGFLAVOR_LANMAN 0 /* wct == 13, LANMAN */
545#define CIFS_NEGFLAVOR_UNENCAP 1 /* wct == 17, but no ext_sec */
546#define CIFS_NEGFLAVOR_EXTENDED 2 /* wct == 17, ext_sec bit set */
547 char negflavor; /* NEGOTIATE response flavor */
544 /* extended security flavors that server supports */ 548 /* extended security flavors that server supports */
545 bool sec_ntlmssp; /* supports NTLMSSP */ 549 bool sec_ntlmssp; /* supports NTLMSSP */
546 bool sec_kerberosu2u; /* supports U2U Kerberos */ 550 bool sec_kerberosu2u; /* supports U2U Kerberos */
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index e63961086752..80ca6886a816 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -615,6 +615,7 @@ CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses)
615 rc = -EOPNOTSUPP; 615 rc = -EOPNOTSUPP;
616 goto neg_err_exit; 616 goto neg_err_exit;
617 } else if (pSMBr->hdr.WordCount == 13) { 617 } else if (pSMBr->hdr.WordCount == 13) {
618 server->negflavor = CIFS_NEGFLAVOR_LANMAN;
618 rc = decode_lanman_negprot_rsp(server, pSMBr, secFlags); 619 rc = decode_lanman_negprot_rsp(server, pSMBr, secFlags);
619 goto signing_check; 620 goto signing_check;
620 } else if (pSMBr->hdr.WordCount != 17) { 621 } else if (pSMBr->hdr.WordCount != 17) {
@@ -666,17 +667,21 @@ CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses)
666 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); 667 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone);
667 server->timeAdj *= 60; 668 server->timeAdj *= 60;
668 669
669 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) 670 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) {
671 server->negflavor = CIFS_NEGFLAVOR_UNENCAP;
670 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, 672 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey,
671 CIFS_CRYPTO_KEY_SIZE); 673 CIFS_CRYPTO_KEY_SIZE);
672 else if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || 674 } else if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC ||
673 server->capabilities & CAP_EXTENDED_SECURITY) && 675 server->capabilities & CAP_EXTENDED_SECURITY) &&
674 (pSMBr->EncryptionKeyLength == 0)) 676 (pSMBr->EncryptionKeyLength == 0)) {
677 server->negflavor = CIFS_NEGFLAVOR_EXTENDED;
675 rc = decode_ext_sec_blob(server, pSMBr); 678 rc = decode_ext_sec_blob(server, pSMBr);
676 else if (server->sec_mode & SECMODE_PW_ENCRYPT) 679 } else if (server->sec_mode & SECMODE_PW_ENCRYPT) {
677 rc = -EIO; /* no crypt key only if plain text pwd */ 680 rc = -EIO; /* no crypt key only if plain text pwd */
678 else 681 } else {
682 server->negflavor = CIFS_NEGFLAVOR_UNENCAP;
679 server->capabilities &= ~CAP_EXTENDED_SECURITY; 683 server->capabilities &= ~CAP_EXTENDED_SECURITY;
684 }
680 685
681signing_check: 686signing_check:
682 if (!rc) 687 if (!rc)
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index ebb97b484ab1..1609699e7bec 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -405,6 +405,8 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
405 } 405 }
406 server->dialect = le16_to_cpu(rsp->DialectRevision); 406 server->dialect = le16_to_cpu(rsp->DialectRevision);
407 407
408 /* SMB2 only has an extended negflavor */
409 server->negflavor = CIFS_NEGFLAVOR_EXTENDED;
408 server->maxBuf = le32_to_cpu(rsp->MaxTransactSize); 410 server->maxBuf = le32_to_cpu(rsp->MaxTransactSize);
409 server->max_read = le32_to_cpu(rsp->MaxReadSize); 411 server->max_read = le32_to_cpu(rsp->MaxReadSize);
410 server->max_write = le32_to_cpu(rsp->MaxWriteSize); 412 server->max_write = le32_to_cpu(rsp->MaxWriteSize);