Loading fs/cifs/cifsproto.h +2 −2 Original line number Diff line number Diff line Loading @@ -146,8 +146,8 @@ extern int CIFSSMBUnixQPathInfo(const int xid, extern int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, const unsigned char *searchName, unsigned char **targetUNCs, unsigned int *number_of_UNC_in_array, struct dfs_info3_param **target_nodes, unsigned int *number_of_nodes_in_array, const struct nls_table *nls_codepage, int remap); extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, Loading fs/cifs/cifssmb.c +77 −92 Original line number Diff line number Diff line Loading @@ -3870,8 +3870,8 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, const unsigned char *searchName, unsigned char **targetUNCs, unsigned int *number_of_UNC_in_array, struct dfs_info3_param **target_nodes, unsigned int *num_of_nodes, const struct nls_table *nls_codepage, int remap) { /* TRANS2_GET_DFS_REFERRAL */ Loading @@ -3884,8 +3884,8 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, unsigned int i; char *temp; __u16 params, byte_count; *number_of_UNC_in_array = 0; *targetUNCs = NULL; *num_of_nodes = 0; *target_nodes = NULL; cFYI(1, ("In GetDFSRefer the path %s", searchName)); if (ses == NULL) Loading Loading @@ -3955,8 +3955,8 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, (struct smb_hdr *) pSMBr, &bytes_returned, 0); if (rc) { cFYI(1, ("Send error in GetDFSRefer = %d", rc)); } else { /* decode response */ /* BB Add logic to parse referrals here */ goto GetDFSRefExit; } rc = validate_t2((struct smb_t2_rsp *)pSMBr); /* BB Also check if enough total bytes returned? */ Loading @@ -3966,8 +3966,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_count = le16_to_cpu(pSMBr->t2.DataCount); cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d", cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d", pSMBr->ByteCount, data_offset)); referrals = (struct dfs_referral_level_3 *) Loading @@ -3986,23 +3985,21 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, /* BB This field is actually two bytes in from start of data block so we could do safety check that DataBlock begins at address of pSMBr->NumberOfReferrals */ *number_of_UNC_in_array = le16_to_cpu(pSMBr->NumberOfReferrals); *num_of_nodes = le16_to_cpu(pSMBr->NumberOfReferrals); /* BB Fix below so can return more than one referral */ if (*number_of_UNC_in_array > 1) *number_of_UNC_in_array = 1; if (*num_of_nodes > 1) *num_of_nodes = 1; /* get the length of the strings describing refs */ name_len = 0; for (i = 0; i < *number_of_UNC_in_array; i++) { for (i = 0; i < *num_of_nodes; i++) { /* make sure that DfsPathOffset not past end */ __u16 offset = le16_to_cpu(referrals->DfsPathOffset); __u16 offset = le16_to_cpu(referrals->DfsPathOffset); if (offset > data_count) { /* if invalid referral, stop here and do not try to copy any more */ *number_of_UNC_in_array = i; *num_of_nodes = i; break; } temp = ((char *)referrals) + offset; Loading @@ -4018,36 +4015,24 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, not fall off end PDU */ } /* BB add check for name_len bigger than bcc */ *targetUNCs = kmalloc(name_len+1+(*number_of_UNC_in_array), *target_nodes = kmalloc(name_len+1+(*num_of_nodes), GFP_KERNEL); if (*targetUNCs == NULL) { if (*target_nodes == NULL) { rc = -ENOMEM; goto GetDFSRefExit; } /* copy the ref strings */ referrals = (struct dfs_referral_level_3 *) (8 /* sizeof data hdr */ + data_offset + (char *) &pSMBr->hdr.Protocol); for (i = 0; i < *number_of_UNC_in_array; i++) { for (i = 0; i < *num_of_nodes; i++) { temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset); if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { cifs_strfromUCS_le(*targetUNCs, (__le16 *) temp, name_len, nls_codepage); } else { strncpy(*targetUNCs, temp, name_len); } /* BB update target_uncs pointers */ referrals++; } temp = *targetUNCs; temp[name_len] = 0; } } GetDFSRefExit: if (pSMB) Loading fs/cifs/connect.c +1 −2 Original line number Diff line number Diff line Loading @@ -1425,7 +1425,6 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, { char *temp_unc; int rc = 0; unsigned char *targetUNCs; *pnum_referrals = 0; *preferrals = NULL; Loading @@ -1448,7 +1447,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, kfree(temp_unc); } if (rc == 0) rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, &targetUNCs, rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals, pnum_referrals, nls_codepage, remap); /* BB map targetUNCs to dfs_info3 structures, here or in CIFSGetDFSRefer BB */ Loading fs/cifs/link.c +0 −1 Original line number Diff line number Diff line Loading @@ -234,7 +234,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) struct cifs_sb_info *cifs_sb; struct cifsTconInfo *pTcon; char *full_path = NULL; char *tmp_path = NULL; char *tmpbuffer; int len; __u16 fid; Loading Loading
fs/cifs/cifsproto.h +2 −2 Original line number Diff line number Diff line Loading @@ -146,8 +146,8 @@ extern int CIFSSMBUnixQPathInfo(const int xid, extern int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, const unsigned char *searchName, unsigned char **targetUNCs, unsigned int *number_of_UNC_in_array, struct dfs_info3_param **target_nodes, unsigned int *number_of_nodes_in_array, const struct nls_table *nls_codepage, int remap); extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, Loading
fs/cifs/cifssmb.c +77 −92 Original line number Diff line number Diff line Loading @@ -3870,8 +3870,8 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, const unsigned char *searchName, unsigned char **targetUNCs, unsigned int *number_of_UNC_in_array, struct dfs_info3_param **target_nodes, unsigned int *num_of_nodes, const struct nls_table *nls_codepage, int remap) { /* TRANS2_GET_DFS_REFERRAL */ Loading @@ -3884,8 +3884,8 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, unsigned int i; char *temp; __u16 params, byte_count; *number_of_UNC_in_array = 0; *targetUNCs = NULL; *num_of_nodes = 0; *target_nodes = NULL; cFYI(1, ("In GetDFSRefer the path %s", searchName)); if (ses == NULL) Loading Loading @@ -3955,8 +3955,8 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, (struct smb_hdr *) pSMBr, &bytes_returned, 0); if (rc) { cFYI(1, ("Send error in GetDFSRefer = %d", rc)); } else { /* decode response */ /* BB Add logic to parse referrals here */ goto GetDFSRefExit; } rc = validate_t2((struct smb_t2_rsp *)pSMBr); /* BB Also check if enough total bytes returned? */ Loading @@ -3966,8 +3966,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_count = le16_to_cpu(pSMBr->t2.DataCount); cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d", cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d", pSMBr->ByteCount, data_offset)); referrals = (struct dfs_referral_level_3 *) Loading @@ -3986,23 +3985,21 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, /* BB This field is actually two bytes in from start of data block so we could do safety check that DataBlock begins at address of pSMBr->NumberOfReferrals */ *number_of_UNC_in_array = le16_to_cpu(pSMBr->NumberOfReferrals); *num_of_nodes = le16_to_cpu(pSMBr->NumberOfReferrals); /* BB Fix below so can return more than one referral */ if (*number_of_UNC_in_array > 1) *number_of_UNC_in_array = 1; if (*num_of_nodes > 1) *num_of_nodes = 1; /* get the length of the strings describing refs */ name_len = 0; for (i = 0; i < *number_of_UNC_in_array; i++) { for (i = 0; i < *num_of_nodes; i++) { /* make sure that DfsPathOffset not past end */ __u16 offset = le16_to_cpu(referrals->DfsPathOffset); __u16 offset = le16_to_cpu(referrals->DfsPathOffset); if (offset > data_count) { /* if invalid referral, stop here and do not try to copy any more */ *number_of_UNC_in_array = i; *num_of_nodes = i; break; } temp = ((char *)referrals) + offset; Loading @@ -4018,36 +4015,24 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, not fall off end PDU */ } /* BB add check for name_len bigger than bcc */ *targetUNCs = kmalloc(name_len+1+(*number_of_UNC_in_array), *target_nodes = kmalloc(name_len+1+(*num_of_nodes), GFP_KERNEL); if (*targetUNCs == NULL) { if (*target_nodes == NULL) { rc = -ENOMEM; goto GetDFSRefExit; } /* copy the ref strings */ referrals = (struct dfs_referral_level_3 *) (8 /* sizeof data hdr */ + data_offset + (char *) &pSMBr->hdr.Protocol); for (i = 0; i < *number_of_UNC_in_array; i++) { for (i = 0; i < *num_of_nodes; i++) { temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset); if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { cifs_strfromUCS_le(*targetUNCs, (__le16 *) temp, name_len, nls_codepage); } else { strncpy(*targetUNCs, temp, name_len); } /* BB update target_uncs pointers */ referrals++; } temp = *targetUNCs; temp[name_len] = 0; } } GetDFSRefExit: if (pSMB) Loading
fs/cifs/connect.c +1 −2 Original line number Diff line number Diff line Loading @@ -1425,7 +1425,6 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, { char *temp_unc; int rc = 0; unsigned char *targetUNCs; *pnum_referrals = 0; *preferrals = NULL; Loading @@ -1448,7 +1447,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, kfree(temp_unc); } if (rc == 0) rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, &targetUNCs, rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals, pnum_referrals, nls_codepage, remap); /* BB map targetUNCs to dfs_info3 structures, here or in CIFSGetDFSRefer BB */ Loading
fs/cifs/link.c +0 −1 Original line number Diff line number Diff line Loading @@ -234,7 +234,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) struct cifs_sb_info *cifs_sb; struct cifsTconInfo *pTcon; char *full_path = NULL; char *tmp_path = NULL; char *tmpbuffer; int len; __u16 fid; Loading