diff options
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 55 |
1 files changed, 12 insertions, 43 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index cadacae46b82..f15848374cfa 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -81,41 +81,6 @@ static struct { | |||
81 | #endif /* CONFIG_CIFS_WEAK_PW_HASH */ | 81 | #endif /* CONFIG_CIFS_WEAK_PW_HASH */ |
82 | #endif /* CIFS_POSIX */ | 82 | #endif /* CIFS_POSIX */ |
83 | 83 | ||
84 | /* Allocates buffer into dst and copies smb string from src to it. | ||
85 | * caller is responsible for freeing dst if function returned 0. | ||
86 | * returns: | ||
87 | * on success - 0 | ||
88 | * on failure - errno | ||
89 | */ | ||
90 | static int | ||
91 | cifs_strlcpy_to_host(char **dst, const char *src, const int maxlen, | ||
92 | const bool is_unicode, const struct nls_table *nls_codepage) | ||
93 | { | ||
94 | int plen; | ||
95 | |||
96 | if (is_unicode) { | ||
97 | plen = UniStrnlen((wchar_t *)src, maxlen); | ||
98 | *dst = kmalloc((4 * plen) + 2, GFP_KERNEL); | ||
99 | if (!*dst) | ||
100 | goto cifs_strlcpy_to_host_ErrExit; | ||
101 | cifs_strfromUCS_le(*dst, (__le16 *)src, plen, nls_codepage); | ||
102 | (*dst)[plen] = 0; | ||
103 | (*dst)[plen+1] = 0; /* needed for Unicode */ | ||
104 | } else { | ||
105 | plen = strnlen(src, maxlen); | ||
106 | *dst = kmalloc(plen + 2, GFP_KERNEL); | ||
107 | if (!*dst) | ||
108 | goto cifs_strlcpy_to_host_ErrExit; | ||
109 | strlcpy(*dst, src, plen); | ||
110 | } | ||
111 | return 0; | ||
112 | |||
113 | cifs_strlcpy_to_host_ErrExit: | ||
114 | cERROR(1, ("Failed to allocate buffer for string\n")); | ||
115 | return -ENOMEM; | ||
116 | } | ||
117 | |||
118 | |||
119 | /* Mark as invalid, all open files on tree connections since they | 84 | /* Mark as invalid, all open files on tree connections since they |
120 | were closed when session to server was lost */ | 85 | were closed when session to server was lost */ |
121 | static void mark_open_files_invalid(struct cifsTconInfo *pTcon) | 86 | static void mark_open_files_invalid(struct cifsTconInfo *pTcon) |
@@ -4008,20 +3973,24 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4008 | /* copy DfsPath */ | 3973 | /* copy DfsPath */ |
4009 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); | 3974 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); |
4010 | max_len = data_end - temp; | 3975 | max_len = data_end - temp; |
4011 | rc = cifs_strlcpy_to_host(&(node->path_name), temp, | 3976 | node->path_name = cifs_strndup(temp, max_len, is_unicode, |
4012 | max_len, is_unicode, nls_codepage); | 3977 | nls_codepage); |
4013 | if (rc) | 3978 | if (IS_ERR(node->path_name)) { |
3979 | rc = PTR_ERR(node->path_name); | ||
3980 | node->path_name = NULL; | ||
4014 | goto parse_DFS_referrals_exit; | 3981 | goto parse_DFS_referrals_exit; |
3982 | } | ||
4015 | 3983 | ||
4016 | /* copy link target UNC */ | 3984 | /* copy link target UNC */ |
4017 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); | 3985 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); |
4018 | max_len = data_end - temp; | 3986 | max_len = data_end - temp; |
4019 | rc = cifs_strlcpy_to_host(&(node->node_name), temp, | 3987 | node->node_name = cifs_strndup(temp, max_len, is_unicode, |
4020 | max_len, is_unicode, nls_codepage); | 3988 | nls_codepage); |
4021 | if (rc) | 3989 | if (IS_ERR(node->node_name)) { |
3990 | rc = PTR_ERR(node->node_name); | ||
3991 | node->node_name = NULL; | ||
4022 | goto parse_DFS_referrals_exit; | 3992 | goto parse_DFS_referrals_exit; |
4023 | 3993 | } | |
4024 | ref += le16_to_cpu(ref->Size); | ||
4025 | } | 3994 | } |
4026 | 3995 | ||
4027 | parse_DFS_referrals_exit: | 3996 | parse_DFS_referrals_exit: |