diff options
-rw-r--r-- | fs/cifs/cifspdu.h | 9 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 17 |
2 files changed, 18 insertions, 8 deletions
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index 93d5ee02a25b..65d58b4e6a61 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
@@ -1904,6 +1904,15 @@ typedef struct smb_com_transaction2_get_dfs_refer_req { | |||
1904 | char RequestFileName[1]; | 1904 | char RequestFileName[1]; |
1905 | } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ; | 1905 | } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ; |
1906 | 1906 | ||
1907 | #define DFS_VERSION cpu_to_le16(0x0003) | ||
1908 | |||
1909 | /* DFS server target type */ | ||
1910 | #define DFS_TYPE_LINK 0x0000 /* also for sysvol targets */ | ||
1911 | #define DFS_TYPE_ROOT 0x0001 | ||
1912 | |||
1913 | /* Referral Entry Flags */ | ||
1914 | #define DFS_NAME_LIST_REF 0x0200 | ||
1915 | |||
1907 | typedef struct dfs_referral_level_3 { | 1916 | typedef struct dfs_referral_level_3 { |
1908 | __le16 VersionNumber; | 1917 | __le16 VersionNumber; |
1909 | __le16 Size; | 1918 | __le16 Size; |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 6f8ed93a4ae8..7b9938445b07 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -107,6 +107,7 @@ cifs_strncpy_to_host(char **dst, const char *src, const int maxlen, | |||
107 | strncpy(*dst, src, plen); | 107 | strncpy(*dst, src, plen); |
108 | } | 108 | } |
109 | (*dst)[plen] = 0; | 109 | (*dst)[plen] = 0; |
110 | (*dst)[plen+1] = 0; /* harmless for ASCII case, needed for Unicode */ | ||
110 | return 0; | 111 | return 0; |
111 | 112 | ||
112 | cifs_strncpy_to_host_ErrExit: | 113 | cifs_strncpy_to_host_ErrExit: |
@@ -3907,7 +3908,7 @@ GetInodeNumOut: | |||
3907 | * on failure - errno | 3908 | * on failure - errno |
3908 | */ | 3909 | */ |
3909 | static int | 3910 | static int |
3910 | parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | 3911 | parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, |
3911 | unsigned int *num_of_nodes, | 3912 | unsigned int *num_of_nodes, |
3912 | struct dfs_info3_param **target_nodes, | 3913 | struct dfs_info3_param **target_nodes, |
3913 | const struct nls_table *nls_codepage) | 3914 | const struct nls_table *nls_codepage) |
@@ -3924,7 +3925,7 @@ parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3924 | cERROR(1, ("num_referrals: must be at least > 0," | 3925 | cERROR(1, ("num_referrals: must be at least > 0," |
3925 | "but we get num_referrals = %d\n", *num_of_nodes)); | 3926 | "but we get num_referrals = %d\n", *num_of_nodes)); |
3926 | rc = -EINVAL; | 3927 | rc = -EINVAL; |
3927 | goto parse_DFS_REFERRALS_exit; | 3928 | goto parse_DFS_referrals_exit; |
3928 | } | 3929 | } |
3929 | 3930 | ||
3930 | ref = (struct dfs_referral_level_3 *) &(pSMBr->referrals); | 3931 | ref = (struct dfs_referral_level_3 *) &(pSMBr->referrals); |
@@ -3932,7 +3933,7 @@ parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3932 | cERROR(1, ("Referrals of V%d version are not supported," | 3933 | cERROR(1, ("Referrals of V%d version are not supported," |
3933 | "should be V3", ref->VersionNumber)); | 3934 | "should be V3", ref->VersionNumber)); |
3934 | rc = -EINVAL; | 3935 | rc = -EINVAL; |
3935 | goto parse_DFS_REFERRALS_exit; | 3936 | goto parse_DFS_referrals_exit; |
3936 | } | 3937 | } |
3937 | 3938 | ||
3938 | /* get the upper boundary of the resp buffer */ | 3939 | /* get the upper boundary of the resp buffer */ |
@@ -3948,7 +3949,7 @@ parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3948 | if (*target_nodes == NULL) { | 3949 | if (*target_nodes == NULL) { |
3949 | cERROR(1, ("Failed to allocate buffer for target_nodes\n")); | 3950 | cERROR(1, ("Failed to allocate buffer for target_nodes\n")); |
3950 | rc = -ENOMEM; | 3951 | rc = -ENOMEM; |
3951 | goto parse_DFS_REFERRALS_exit; | 3952 | goto parse_DFS_referrals_exit; |
3952 | } | 3953 | } |
3953 | 3954 | ||
3954 | /* collect neccessary data from referrals */ | 3955 | /* collect neccessary data from referrals */ |
@@ -3968,7 +3969,7 @@ parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3968 | rc = cifs_strncpy_to_host(&(node->path_name), temp, | 3969 | rc = cifs_strncpy_to_host(&(node->path_name), temp, |
3969 | max_len, is_unicode, nls_codepage); | 3970 | max_len, is_unicode, nls_codepage); |
3970 | if (rc) | 3971 | if (rc) |
3971 | goto parse_DFS_REFERRALS_exit; | 3972 | goto parse_DFS_referrals_exit; |
3972 | 3973 | ||
3973 | /* copy link target UNC */ | 3974 | /* copy link target UNC */ |
3974 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); | 3975 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); |
@@ -3976,12 +3977,12 @@ parse_DFS_REFERRALS(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3976 | rc = cifs_strncpy_to_host(&(node->node_name), temp, | 3977 | rc = cifs_strncpy_to_host(&(node->node_name), temp, |
3977 | max_len, is_unicode, nls_codepage); | 3978 | max_len, is_unicode, nls_codepage); |
3978 | if (rc) | 3979 | if (rc) |
3979 | goto parse_DFS_REFERRALS_exit; | 3980 | goto parse_DFS_referrals_exit; |
3980 | 3981 | ||
3981 | ref += ref->Size; | 3982 | ref += ref->Size; |
3982 | } | 3983 | } |
3983 | 3984 | ||
3984 | parse_DFS_REFERRALS_exit: | 3985 | parse_DFS_referrals_exit: |
3985 | if (rc) { | 3986 | if (rc) { |
3986 | free_dfs_info_array(*target_nodes, *num_of_nodes); | 3987 | free_dfs_info_array(*target_nodes, *num_of_nodes); |
3987 | *target_nodes = NULL; | 3988 | *target_nodes = NULL; |
@@ -4090,7 +4091,7 @@ getDFSRetry: | |||
4090 | le16_to_cpu(pSMBr->t2.DataOffset))); | 4091 | le16_to_cpu(pSMBr->t2.DataOffset))); |
4091 | 4092 | ||
4092 | /* parse returned result into more usable form */ | 4093 | /* parse returned result into more usable form */ |
4093 | rc = parse_DFS_REFERRALS(pSMBr, num_of_nodes, | 4094 | rc = parse_DFS_referrals(pSMBr, num_of_nodes, |
4094 | target_nodes, nls_codepage); | 4095 | target_nodes, nls_codepage); |
4095 | 4096 | ||
4096 | GetDFSRefExit: | 4097 | GetDFSRefExit: |