aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2013-05-26 07:01:00 -0400
committerSteve French <smfrench@gmail.com>2013-06-24 02:56:43 -0400
commit38d77c50b4f4e3ea1687e119871364f1c8d2f531 (patch)
treeb222f1aa85155a24fafcabea2f8e8c17197fb2ae /fs/cifs
parent1e3cc57e474867771aba2bdf23d0c7d8fb5e4822 (diff)
cifs: track the enablement of signing in the TCP_Server_Info
Currently, we determine this according to flags in the sec_mode, flags in the global_secflags and via other methods. That makes the semantics very hard to follow and there are corner cases where we don't handle this correctly. Add a new bool to the TCP_Server_Info that acts as a simple flag to tell us whether signing is enabled on this connection or not, and fix up the places that need to determine this to use that flag. This is a bit weird for the SMB2 case, where signing is per-session. SMB2 needs work in this area already though. The existing SMB2 code has similar logic to what we're using here, so there should be no real change in behavior. These changes should make it easier to implement per-session signing in the future though. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Pavel Shilovsky <piastry@etersoft.ru> Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/cifsglob.h1
-rw-r--r--fs/cifs/cifsproto.h2
-rw-r--r--fs/cifs/cifssmb.c76
-rw-r--r--fs/cifs/connect.c12
-rw-r--r--fs/cifs/misc.c3
-rw-r--r--fs/cifs/sess.c9
-rw-r--r--fs/cifs/smb1ops.c3
-rw-r--r--fs/cifs/smb2pdu.c40
-rw-r--r--fs/cifs/smb2transport.c3
-rw-r--r--fs/cifs/transport.c4
10 files changed, 71 insertions, 82 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 2f3a89a2c497..49020ae460cf 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -511,6 +511,7 @@ struct TCP_Server_Info {
511 struct task_struct *tsk; 511 struct task_struct *tsk;
512 char server_GUID[16]; 512 char server_GUID[16];
513 __u16 sec_mode; 513 __u16 sec_mode;
514 bool sign; /* is signing enabled on this connection? */
514 bool session_estab; /* mark when very first sess is established */ 515 bool session_estab; /* mark when very first sess is established */
515#ifdef CONFIG_CIFS_SMB2 516#ifdef CONFIG_CIFS_SMB2
516 int echo_credits; /* echo reserved slots */ 517 int echo_credits; /* echo reserved slots */
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index f0e93ffe654c..ede010fd046a 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -212,7 +212,7 @@ extern int cifs_negotiate_protocol(const unsigned int xid,
212 struct cifs_ses *ses); 212 struct cifs_ses *ses);
213extern int cifs_setup_session(const unsigned int xid, struct cifs_ses *ses, 213extern int cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
214 struct nls_table *nls_info); 214 struct nls_table *nls_info);
215extern int cifs_enable_signing(struct TCP_Server_Info *server, unsigned int secFlags); 215extern int cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required);
216extern int CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses); 216extern int CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses);
217 217
218extern int CIFSTCon(const unsigned int xid, struct cifs_ses *ses, 218extern int CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 80ca6886a816..dd7e2f61f607 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -418,32 +418,43 @@ decode_ext_sec_blob(struct TCP_Server_Info *server, NEGOTIATE_RSP *pSMBr)
418} 418}
419 419
420int 420int
421cifs_enable_signing(struct TCP_Server_Info *server, unsigned int secFlags) 421cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required)
422{ 422{
423 if ((secFlags & CIFSSEC_MAY_SIGN) == 0) { 423 bool srv_sign_required = server->sec_mode & SECMODE_SIGN_REQUIRED;
424 /* MUST_SIGN already includes the MAY_SIGN FLAG 424 bool srv_sign_enabled = server->sec_mode & SECMODE_SIGN_ENABLED;
425 so if this is zero it means that signing is disabled */ 425 bool mnt_sign_enabled = global_secflags & CIFSSEC_MAY_SIGN;
426 cifs_dbg(FYI, "Signing disabled\n"); 426
427 if (server->sec_mode & SECMODE_SIGN_REQUIRED) { 427 /*
428 cifs_dbg(VFS, "Server requires packet signing to be enabled in /proc/fs/cifs/SecurityFlags\n"); 428 * Is signing required by mnt options? If not then check
429 return -EOPNOTSUPP; 429 * global_secflags to see if it is there.
430 */
431 if (!mnt_sign_required)
432 mnt_sign_required = ((global_secflags & CIFSSEC_MUST_SIGN) ==
433 CIFSSEC_MUST_SIGN);
434
435 /*
436 * If signing is required then it's automatically enabled too,
437 * otherwise, check to see if the secflags allow it.
438 */
439 mnt_sign_enabled = mnt_sign_required ? mnt_sign_required :
440 (global_secflags & CIFSSEC_MAY_SIGN);
441
442 /* If server requires signing, does client allow it? */
443 if (srv_sign_required) {
444 if (!mnt_sign_enabled) {
445 cifs_dbg(VFS, "Server requires signing, but it's disabled in SecurityFlags!");
446 return -ENOTSUPP;
430 } 447 }
431 server->sec_mode &= 448 server->sign = true;
432 ~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED); 449 }
433 } else if ((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) { 450
434 /* signing required */ 451 /* If client requires signing, does server allow it? */
435 cifs_dbg(FYI, "Must sign - secFlags 0x%x\n", secFlags); 452 if (mnt_sign_required) {
436 if ((server->sec_mode & 453 if (!srv_sign_enabled) {
437 (SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED)) == 0) { 454 cifs_dbg(VFS, "Server does not support signing!");
438 cifs_dbg(VFS, "signing required but server lacks support\n"); 455 return -ENOTSUPP;
439 return -EOPNOTSUPP; 456 }
440 } else 457 server->sign = true;
441 server->sec_mode |= SECMODE_SIGN_REQUIRED;
442 } else {
443 /* signing optional ie CIFSSEC_MAY_SIGN */
444 if ((server->sec_mode & SECMODE_SIGN_REQUIRED) == 0)
445 server->sec_mode &=
446 ~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED);
447 } 458 }
448 459
449 return 0; 460 return 0;
@@ -685,7 +696,7 @@ CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses)
685 696
686signing_check: 697signing_check:
687 if (!rc) 698 if (!rc)
688 rc = cifs_enable_signing(server, secFlags); 699 rc = cifs_enable_signing(server, ses->sign);
689neg_err_exit: 700neg_err_exit:
690 cifs_buf_release(pSMB); 701 cifs_buf_release(pSMB);
691 702
@@ -810,9 +821,8 @@ CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses)
810 821
811 pSMB->hdr.Mid = get_next_mid(ses->server); 822 pSMB->hdr.Mid = get_next_mid(ses->server);
812 823
813 if (ses->server->sec_mode & 824 if (ses->server->sign)
814 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) 825 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
815 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
816 826
817 pSMB->hdr.Uid = ses->Suid; 827 pSMB->hdr.Uid = ses->Suid;
818 828
@@ -1573,8 +1583,7 @@ cifs_readv_callback(struct mid_q_entry *mid)
1573 switch (mid->mid_state) { 1583 switch (mid->mid_state) {
1574 case MID_RESPONSE_RECEIVED: 1584 case MID_RESPONSE_RECEIVED:
1575 /* result already set, check signature */ 1585 /* result already set, check signature */
1576 if (server->sec_mode & 1586 if (server->sign) {
1577 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
1578 int rc = 0; 1587 int rc = 0;
1579 1588
1580 rc = cifs_verify_signature(&rqst, server, 1589 rc = cifs_verify_signature(&rqst, server,
@@ -4827,11 +4836,8 @@ getDFSRetry:
4827 strncpy(pSMB->RequestFileName, search_name, name_len); 4836 strncpy(pSMB->RequestFileName, search_name, name_len);
4828 } 4837 }
4829 4838
4830 if (ses->server) { 4839 if (ses->server && ses->server->sign)
4831 if (ses->server->sec_mode & 4840 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4832 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
4833 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4834 }
4835 4841
4836 pSMB->hdr.Uid = ses->Suid; 4842 pSMB->hdr.Uid = ses->Suid;
4837 4843
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index f638b5e1a2d2..acbb255352af 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -2037,13 +2037,8 @@ match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2037 } 2037 }
2038 2038
2039 /* now check if signing mode is acceptable */ 2039 /* now check if signing mode is acceptable */
2040 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 && 2040 if (vol->sign && !server->sign)
2041 (server->sec_mode & SECMODE_SIGN_REQUIRED)) 2041 return false;
2042 return false;
2043 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
2044 (server->sec_mode &
2045 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
2046 return false;
2047 2042
2048 return true; 2043 return true;
2049} 2044}
@@ -3704,8 +3699,7 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3704 } 3699 }
3705 } 3700 }
3706 3701
3707 if (ses->server->sec_mode & 3702 if (ses->server->sign)
3708 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3709 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; 3703 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3710 3704
3711 if (ses->capabilities & CAP_STATUS32) { 3705 if (ses->capabilities & CAP_STATUS32) {
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index 1bec014779fd..f7d4b2285efe 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -267,8 +267,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
267 if (treeCon->nocase) 267 if (treeCon->nocase)
268 buffer->Flags |= SMBFLG_CASELESS; 268 buffer->Flags |= SMBFLG_CASELESS;
269 if ((treeCon->ses) && (treeCon->ses->server)) 269 if ((treeCon->ses) && (treeCon->ses->server))
270 if (treeCon->ses->server->sec_mode & 270 if (treeCon->ses->server->sign)
271 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
272 buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; 271 buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
273 } 272 }
274 273
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index 0d0fe38f66a2..82b784a62c16 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -138,8 +138,7 @@ static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
138 capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS | 138 capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
139 CAP_LARGE_WRITE_X | CAP_LARGE_READ_X; 139 CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
140 140
141 if (ses->server->sec_mode & 141 if (ses->server->sign)
142 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
143 pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; 142 pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
144 143
145 if (ses->capabilities & CAP_UNICODE) { 144 if (ses->capabilities & CAP_UNICODE) {
@@ -427,8 +426,7 @@ void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
427 flags = NTLMSSP_NEGOTIATE_56 | NTLMSSP_REQUEST_TARGET | 426 flags = NTLMSSP_NEGOTIATE_56 | NTLMSSP_REQUEST_TARGET |
428 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE | 427 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
429 NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC; 428 NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
430 if (ses->server->sec_mode & 429 if (ses->server->sign) {
431 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
432 flags |= NTLMSSP_NEGOTIATE_SIGN; 430 flags |= NTLMSSP_NEGOTIATE_SIGN;
433 if (!ses->server->session_estab) 431 if (!ses->server->session_estab)
434 flags |= NTLMSSP_NEGOTIATE_KEY_XCH; 432 flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
@@ -466,8 +464,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
466 NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO | 464 NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
467 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE | 465 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
468 NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC; 466 NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
469 if (ses->server->sec_mode & 467 if (ses->server->sign) {
470 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
471 flags |= NTLMSSP_NEGOTIATE_SIGN; 468 flags |= NTLMSSP_NEGOTIATE_SIGN;
472 if (!ses->server->session_estab) 469 if (!ses->server->session_estab)
473 flags |= NTLMSSP_NEGOTIATE_KEY_XCH; 470 flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
index 7d1c78bce4ae..b28aabd33edd 100644
--- a/fs/cifs/smb1ops.c
+++ b/fs/cifs/smb1ops.c
@@ -449,8 +449,7 @@ cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
449 * WRITEX header, not including the 4 byte RFC1001 length. 449 * WRITEX header, not including the 4 byte RFC1001 length.
450 */ 450 */
451 if (!(server->capabilities & CAP_LARGE_WRITE_X) || 451 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
452 (!(server->capabilities & CAP_UNIX) && 452 (!(server->capabilities & CAP_UNIX) && server->sign))
453 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
454 wsize = min_t(unsigned int, wsize, 453 wsize = min_t(unsigned int, wsize,
455 server->maxBuf - sizeof(WRITE_REQ) + 4); 454 server->maxBuf - sizeof(WRITE_REQ) + 4);
456 455
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 1609699e7bec..ad8ef10de0bd 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -119,8 +119,7 @@ smb2_hdr_assemble(struct smb2_hdr *hdr, __le16 smb2_cmd /* command */ ,
119 /* BB how does SMB2 do case sensitive? */ 119 /* BB how does SMB2 do case sensitive? */
120 /* if (tcon->nocase) 120 /* if (tcon->nocase)
121 hdr->Flags |= SMBFLG_CASELESS; */ 121 hdr->Flags |= SMBFLG_CASELESS; */
122 if (tcon->ses && tcon->ses->server && 122 if (tcon->ses && tcon->ses->server && tcon->ses->server->sign)
123 (tcon->ses->server->sec_mode & SECMODE_SIGN_REQUIRED))
124 hdr->Flags |= SMB2_FLAGS_SIGNED; 123 hdr->Flags |= SMB2_FLAGS_SIGNED;
125out: 124out:
126 pdu->StructureSize2 = cpu_to_le16(parmsize); 125 pdu->StructureSize2 = cpu_to_le16(parmsize);
@@ -330,7 +329,6 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
330 int resp_buftype; 329 int resp_buftype;
331 struct TCP_Server_Info *server = ses->server; 330 struct TCP_Server_Info *server = ses->server;
332 unsigned int sec_flags; 331 unsigned int sec_flags;
333 u16 temp = 0;
334 int blob_offset, blob_length; 332 int blob_offset, blob_length;
335 char *security_blob; 333 char *security_blob;
336 int flags = CIFS_NEG_OP; 334 int flags = CIFS_NEG_OP;
@@ -362,12 +360,12 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
362 inc_rfc1001_len(req, 2); 360 inc_rfc1001_len(req, 2);
363 361
364 /* only one of SMB2 signing flags may be set in SMB2 request */ 362 /* only one of SMB2 signing flags may be set in SMB2 request */
365 if ((sec_flags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) 363 if (ses->sign)
366 temp = SMB2_NEGOTIATE_SIGNING_REQUIRED; 364 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED;
367 else if (sec_flags & CIFSSEC_MAY_SIGN) /* MAY_SIGN is a single flag */ 365 else if (global_secflags & CIFSSEC_MAY_SIGN)
368 temp = SMB2_NEGOTIATE_SIGNING_ENABLED; 366 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED;
369 367 else
370 req->SecurityMode = cpu_to_le16(temp); 368 req->SecurityMode = 0;
371 369
372 req->Capabilities = cpu_to_le32(ses->server->vals->req_capabilities); 370 req->Capabilities = cpu_to_le32(ses->server->vals->req_capabilities);
373 371
@@ -424,8 +422,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
424 goto neg_exit; 422 goto neg_exit;
425 } 423 }
426 424
427 cifs_dbg(FYI, "sec_flags 0x%x\n", sec_flags); 425 rc = cifs_enable_signing(server, ses->sign);
428 rc = cifs_enable_signing(server, sec_flags);
429#ifdef CONFIG_SMB2_ASN1 /* BB REMOVEME when updated asn1.c ready */ 426#ifdef CONFIG_SMB2_ASN1 /* BB REMOVEME when updated asn1.c ready */
430 if (rc) 427 if (rc)
431 goto neg_exit; 428 goto neg_exit;
@@ -457,7 +454,6 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,
457 __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */ 454 __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */
458 struct TCP_Server_Info *server = ses->server; 455 struct TCP_Server_Info *server = ses->server;
459 unsigned int sec_flags; 456 unsigned int sec_flags;
460 u8 temp = 0;
461 u16 blob_length = 0; 457 u16 blob_length = 0;
462 char *security_blob; 458 char *security_blob;
463 char *ntlmssp_blob = NULL; 459 char *ntlmssp_blob = NULL;
@@ -502,14 +498,13 @@ ssetup_ntlmssp_authenticate:
502 req->hdr.CreditRequest = cpu_to_le16(3); 498 req->hdr.CreditRequest = cpu_to_le16(3);
503 499
504 /* only one of SMB2 signing flags may be set in SMB2 request */ 500 /* only one of SMB2 signing flags may be set in SMB2 request */
505 if ((sec_flags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) 501 if (server->sign)
506 temp = SMB2_NEGOTIATE_SIGNING_REQUIRED; 502 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED;
507 else if (ses->server->sec_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) 503 else if (global_secflags & CIFSSEC_MAY_SIGN) /* one flag unlike MUST_ */
508 temp = SMB2_NEGOTIATE_SIGNING_REQUIRED; 504 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED;
509 else if (sec_flags & CIFSSEC_MAY_SIGN) /* MAY_SIGN is a single flag */ 505 else
510 temp = SMB2_NEGOTIATE_SIGNING_ENABLED; 506 req->SecurityMode = 0;
511 507
512 req->SecurityMode = temp;
513 req->Capabilities = 0; 508 req->Capabilities = 0;
514 req->Channel = 0; /* MBZ */ 509 req->Channel = 0; /* MBZ */
515 510
@@ -652,7 +647,7 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
652 647
653 /* since no tcon, smb2_init can not do this, so do here */ 648 /* since no tcon, smb2_init can not do this, so do here */
654 req->hdr.SessionId = ses->Suid; 649 req->hdr.SessionId = ses->Suid;
655 if (server->sec_mode & SECMODE_SIGN_REQUIRED) 650 if (server->sign)
656 req->hdr.Flags |= SMB2_FLAGS_SIGNED; 651 req->hdr.Flags |= SMB2_FLAGS_SIGNED;
657 652
658 rc = SendReceiveNoRsp(xid, ses, (char *) &req->hdr, 0); 653 rc = SendReceiveNoRsp(xid, ses, (char *) &req->hdr, 0);
@@ -1357,8 +1352,7 @@ smb2_readv_callback(struct mid_q_entry *mid)
1357 case MID_RESPONSE_RECEIVED: 1352 case MID_RESPONSE_RECEIVED:
1358 credits_received = le16_to_cpu(buf->CreditRequest); 1353 credits_received = le16_to_cpu(buf->CreditRequest);
1359 /* result already set, check signature */ 1354 /* result already set, check signature */
1360 if (server->sec_mode & 1355 if (server->sign) {
1361 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
1362 int rc; 1356 int rc;
1363 1357
1364 rc = smb2_verify_signature(&rqst, server); 1358 rc = smb2_verify_signature(&rqst, server);
diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c
index 01f0ac800780..c802ecfa770e 100644
--- a/fs/cifs/smb2transport.c
+++ b/fs/cifs/smb2transport.c
@@ -275,8 +275,7 @@ smb2_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
275 275
276 dump_smb(mid->resp_buf, min_t(u32, 80, len)); 276 dump_smb(mid->resp_buf, min_t(u32, 80, len));
277 /* convert the length into a more usable form */ 277 /* convert the length into a more usable form */
278 if ((len > 24) && 278 if (len > 24 && server->sign) {
279 (server->sec_mode & (SECMODE_SIGN_REQUIRED|SECMODE_SIGN_ENABLED))) {
280 int rc; 279 int rc;
281 280
282 rc = smb2_verify_signature(&rqst, server); 281 rc = smb2_verify_signature(&rqst, server);
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index bfbf4700d160..1996d6ceb833 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -463,7 +463,7 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
463 struct mid_q_entry *mid; 463 struct mid_q_entry *mid;
464 464
465 /* enable signing if server requires it */ 465 /* enable signing if server requires it */
466 if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) 466 if (server->sign)
467 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; 467 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
468 468
469 mid = AllocMidQEntry(hdr, server); 469 mid = AllocMidQEntry(hdr, server);
@@ -612,7 +612,7 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
612 dump_smb(mid->resp_buf, min_t(u32, 92, len)); 612 dump_smb(mid->resp_buf, min_t(u32, 92, len));
613 613
614 /* convert the length into a more usable form */ 614 /* convert the length into a more usable form */
615 if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { 615 if (server->sign) {
616 struct kvec iov; 616 struct kvec iov;
617 int rc = 0; 617 int rc = 0;
618 struct smb_rqst rqst = { .rq_iov = &iov, 618 struct smb_rqst rqst = { .rq_iov = &iov,