aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/connect.c49
1 files changed, 14 insertions, 35 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index bacdef1546b7..e94d6b29af64 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -3638,7 +3638,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
3638 TCONX_RSP *pSMBr; 3638 TCONX_RSP *pSMBr;
3639 unsigned char *bcc_ptr; 3639 unsigned char *bcc_ptr;
3640 int rc = 0; 3640 int rc = 0;
3641 int length; 3641 int length, bytes_left;
3642 __u16 count; 3642 __u16 count;
3643 3643
3644 if (ses == NULL) 3644 if (ses == NULL)
@@ -3726,14 +3726,15 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
3726 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length, 3726 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3727 CIFS_STD_OP); 3727 CIFS_STD_OP);
3728 3728
3729 /* if (rc) rc = map_smb_to_linux_error(smb_buffer_response); */
3730 /* above now done in SendReceive */ 3729 /* above now done in SendReceive */
3731 if ((rc == 0) && (tcon != NULL)) { 3730 if ((rc == 0) && (tcon != NULL)) {
3732 tcon->tidStatus = CifsGood; 3731 tcon->tidStatus = CifsGood;
3733 tcon->need_reconnect = false; 3732 tcon->need_reconnect = false;
3734 tcon->tid = smb_buffer_response->Tid; 3733 tcon->tid = smb_buffer_response->Tid;
3735 bcc_ptr = pByteArea(smb_buffer_response); 3734 bcc_ptr = pByteArea(smb_buffer_response);
3736 length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2); 3735 bytes_left = BCC(smb_buffer_response);
3736 length = strnlen(bcc_ptr, bytes_left - 2);
3737
3737 /* skip service field (NB: this field is always ASCII) */ 3738 /* skip service field (NB: this field is always ASCII) */
3738 if (length == 3) { 3739 if (length == 3) {
3739 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') && 3740 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
@@ -3748,39 +3749,17 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
3748 } 3749 }
3749 } 3750 }
3750 bcc_ptr += length + 1; 3751 bcc_ptr += length + 1;
3752 bytes_left -= (length + 1);
3751 strncpy(tcon->treeName, tree, MAX_TREE_SIZE); 3753 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3752 if (smb_buffer->Flags2 & SMBFLG2_UNICODE) { 3754
3753 length = UniStrnlen((wchar_t *) bcc_ptr, 512); 3755 /* mostly informational -- no need to fail on error here */
3754 if ((bcc_ptr + (2 * length)) - 3756 tcon->nativeFileSystem = cifs_strndup(bcc_ptr, bytes_left,
3755 pByteArea(smb_buffer_response) <= 3757 smb_buffer->Flags2 &
3756 BCC(smb_buffer_response)) { 3758 SMBFLG2_UNICODE,
3757 kfree(tcon->nativeFileSystem); 3759 nls_codepage);
3758 tcon->nativeFileSystem = 3760
3759 kzalloc((4 * length) + 2, GFP_KERNEL); 3761 cFYI(1, ("nativeFileSystem=%s", tcon->nativeFileSystem));
3760 if (tcon->nativeFileSystem) { 3762
3761 cifs_strfromUCS_le(
3762 tcon->nativeFileSystem,
3763 (__le16 *) bcc_ptr,
3764 length, nls_codepage);
3765 cFYI(1, ("nativeFileSystem=%s",
3766 tcon->nativeFileSystem));
3767 }
3768 }
3769 /* else do not bother copying these information fields*/
3770 } else {
3771 length = strnlen(bcc_ptr, 1024);
3772 if ((bcc_ptr + length) -
3773 pByteArea(smb_buffer_response) <=
3774 BCC(smb_buffer_response)) {
3775 kfree(tcon->nativeFileSystem);
3776 tcon->nativeFileSystem =
3777 kzalloc(length + 1, GFP_KERNEL);
3778 if (tcon->nativeFileSystem)
3779 strncpy(tcon->nativeFileSystem, bcc_ptr,
3780 length);
3781 }
3782 /* else do not bother copying these information fields*/
3783 }
3784 if ((smb_buffer_response->WordCount == 3) || 3763 if ((smb_buffer_response->WordCount == 3) ||
3785 (smb_buffer_response->WordCount == 7)) 3764 (smb_buffer_response->WordCount == 7))
3786 /* field is in same location */ 3765 /* field is in same location */