@@ -4786,117 +4786,6 @@ CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon,
4786
4786
return rc ;
4787
4787
}
4788
4788
4789
- /* parses DFS refferal V3 structure
4790
- * caller is responsible for freeing target_nodes
4791
- * returns:
4792
- * on success - 0
4793
- * on failure - errno
4794
- */
4795
- static int
4796
- parse_DFS_referrals (TRANSACTION2_GET_DFS_REFER_RSP * pSMBr ,
4797
- unsigned int * num_of_nodes ,
4798
- struct dfs_info3_param * * target_nodes ,
4799
- const struct nls_table * nls_codepage , int remap ,
4800
- const char * searchName )
4801
- {
4802
- int i , rc = 0 ;
4803
- char * data_end ;
4804
- bool is_unicode ;
4805
- struct dfs_referral_level_3 * ref ;
4806
-
4807
- if (pSMBr -> hdr .Flags2 & SMBFLG2_UNICODE )
4808
- is_unicode = true;
4809
- else
4810
- is_unicode = false;
4811
- * num_of_nodes = le16_to_cpu (pSMBr -> NumberOfReferrals );
4812
-
4813
- if (* num_of_nodes < 1 ) {
4814
- cifs_dbg (VFS , "num_referrals: must be at least > 0, but we get num_referrals = %d\n" ,
4815
- * num_of_nodes );
4816
- rc = - EINVAL ;
4817
- goto parse_DFS_referrals_exit ;
4818
- }
4819
-
4820
- ref = (struct dfs_referral_level_3 * ) & (pSMBr -> referrals );
4821
- if (ref -> VersionNumber != cpu_to_le16 (3 )) {
4822
- cifs_dbg (VFS , "Referrals of V%d version are not supported, should be V3\n" ,
4823
- le16_to_cpu (ref -> VersionNumber ));
4824
- rc = - EINVAL ;
4825
- goto parse_DFS_referrals_exit ;
4826
- }
4827
-
4828
- /* get the upper boundary of the resp buffer */
4829
- data_end = (char * )(& (pSMBr -> PathConsumed )) +
4830
- le16_to_cpu (pSMBr -> t2 .DataCount );
4831
-
4832
- cifs_dbg (FYI , "num_referrals: %d dfs flags: 0x%x ...\n" ,
4833
- * num_of_nodes , le32_to_cpu (pSMBr -> DFSFlags ));
4834
-
4835
- * target_nodes = kcalloc (* num_of_nodes , sizeof (struct dfs_info3_param ),
4836
- GFP_KERNEL );
4837
- if (* target_nodes == NULL ) {
4838
- rc = - ENOMEM ;
4839
- goto parse_DFS_referrals_exit ;
4840
- }
4841
-
4842
- /* collect necessary data from referrals */
4843
- for (i = 0 ; i < * num_of_nodes ; i ++ ) {
4844
- char * temp ;
4845
- int max_len ;
4846
- struct dfs_info3_param * node = (* target_nodes )+ i ;
4847
-
4848
- node -> flags = le32_to_cpu (pSMBr -> DFSFlags );
4849
- if (is_unicode ) {
4850
- __le16 * tmp = kmalloc (strlen (searchName )* 2 + 2 ,
4851
- GFP_KERNEL );
4852
- if (tmp == NULL ) {
4853
- rc = - ENOMEM ;
4854
- goto parse_DFS_referrals_exit ;
4855
- }
4856
- cifsConvertToUTF16 ((__le16 * ) tmp , searchName ,
4857
- PATH_MAX , nls_codepage , remap );
4858
- node -> path_consumed = cifs_utf16_bytes (tmp ,
4859
- le16_to_cpu (pSMBr -> PathConsumed ),
4860
- nls_codepage );
4861
- kfree (tmp );
4862
- } else
4863
- node -> path_consumed = le16_to_cpu (pSMBr -> PathConsumed );
4864
-
4865
- node -> server_type = le16_to_cpu (ref -> ServerType );
4866
- node -> ref_flag = le16_to_cpu (ref -> ReferralEntryFlags );
4867
-
4868
- /* copy DfsPath */
4869
- temp = (char * )ref + le16_to_cpu (ref -> DfsPathOffset );
4870
- max_len = data_end - temp ;
4871
- node -> path_name = cifs_strndup_from_utf16 (temp , max_len ,
4872
- is_unicode , nls_codepage );
4873
- if (!node -> path_name ) {
4874
- rc = - ENOMEM ;
4875
- goto parse_DFS_referrals_exit ;
4876
- }
4877
-
4878
- /* copy link target UNC */
4879
- temp = (char * )ref + le16_to_cpu (ref -> NetworkAddressOffset );
4880
- max_len = data_end - temp ;
4881
- node -> node_name = cifs_strndup_from_utf16 (temp , max_len ,
4882
- is_unicode , nls_codepage );
4883
- if (!node -> node_name ) {
4884
- rc = - ENOMEM ;
4885
- goto parse_DFS_referrals_exit ;
4886
- }
4887
-
4888
- ref ++ ;
4889
- }
4890
-
4891
- parse_DFS_referrals_exit :
4892
- if (rc ) {
4893
- free_dfs_info_array (* target_nodes , * num_of_nodes );
4894
- * target_nodes = NULL ;
4895
- * num_of_nodes = 0 ;
4896
- }
4897
- return rc ;
4898
- }
4899
-
4900
4789
int
4901
4790
CIFSGetDFSRefer (const unsigned int xid , struct cifs_ses * ses ,
4902
4791
const char * search_name , struct dfs_info3_param * * target_nodes ,
@@ -4993,9 +4882,11 @@ CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses,
4993
4882
get_bcc (& pSMBr -> hdr ), le16_to_cpu (pSMBr -> t2 .DataOffset ));
4994
4883
4995
4884
/* parse returned result into more usable form */
4996
- rc = parse_DFS_referrals (pSMBr , num_of_nodes ,
4997
- target_nodes , nls_codepage , remap ,
4998
- search_name );
4885
+ rc = parse_dfs_referrals (& pSMBr -> dfs_data ,
4886
+ le16_to_cpu (pSMBr -> t2 .DataCount ),
4887
+ num_of_nodes , target_nodes , nls_codepage ,
4888
+ remap , search_name ,
4889
+ (pSMBr -> hdr .Flags2 & SMBFLG2_UNICODE ) != 0 );
4999
4890
5000
4891
GetDFSRefExit :
5001
4892
cifs_buf_release (pSMB );
0 commit comments