diff options
| -rw-r--r-- | fs/cifs/cifssmb.c | 23 | ||||
| -rw-r--r-- | fs/cifs/smb2pdu.c | 23 |
2 files changed, 32 insertions, 14 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index b1f49c1c543a..332f88d753d1 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -128,24 +128,31 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc, | |||
| 128 | int rc; | 128 | int rc; |
| 129 | struct dfs_cache_tgt_list tl; | 129 | struct dfs_cache_tgt_list tl; |
| 130 | struct dfs_cache_tgt_iterator *it = NULL; | 130 | struct dfs_cache_tgt_iterator *it = NULL; |
| 131 | char tree[MAX_TREE_SIZE + 1]; | 131 | char *tree; |
| 132 | const char *tcp_host; | 132 | const char *tcp_host; |
| 133 | size_t tcp_host_len; | 133 | size_t tcp_host_len; |
| 134 | const char *dfs_host; | 134 | const char *dfs_host; |
| 135 | size_t dfs_host_len; | 135 | size_t dfs_host_len; |
| 136 | 136 | ||
| 137 | tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL); | ||
| 138 | if (!tree) | ||
| 139 | return -ENOMEM; | ||
| 140 | |||
| 137 | if (tcon->ipc) { | 141 | if (tcon->ipc) { |
| 138 | snprintf(tree, sizeof(tree), "\\\\%s\\IPC$", | 142 | snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", |
| 139 | tcon->ses->server->hostname); | 143 | tcon->ses->server->hostname); |
| 140 | return CIFSTCon(0, tcon->ses, tree, tcon, nlsc); | 144 | rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc); |
| 145 | goto out; | ||
| 141 | } | 146 | } |
| 142 | 147 | ||
| 143 | if (!tcon->dfs_path) | 148 | if (!tcon->dfs_path) { |
| 144 | return CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc); | 149 | rc = CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc); |
| 150 | goto out; | ||
| 151 | } | ||
| 145 | 152 | ||
| 146 | rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl); | 153 | rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl); |
| 147 | if (rc) | 154 | if (rc) |
| 148 | return rc; | 155 | goto out; |
| 149 | 156 | ||
| 150 | extract_unc_hostname(tcon->ses->server->hostname, &tcp_host, | 157 | extract_unc_hostname(tcon->ses->server->hostname, &tcp_host, |
| 151 | &tcp_host_len); | 158 | &tcp_host_len); |
| @@ -165,7 +172,7 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc, | |||
| 165 | continue; | 172 | continue; |
| 166 | } | 173 | } |
| 167 | 174 | ||
| 168 | snprintf(tree, sizeof(tree), "\\%s", tgt); | 175 | snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt); |
| 169 | 176 | ||
| 170 | rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc); | 177 | rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc); |
| 171 | if (!rc) | 178 | if (!rc) |
| @@ -182,6 +189,8 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc, | |||
| 182 | rc = -ENOENT; | 189 | rc = -ENOENT; |
| 183 | } | 190 | } |
| 184 | dfs_cache_free_tgts(&tl); | 191 | dfs_cache_free_tgts(&tl); |
| 192 | out: | ||
| 193 | kfree(tree); | ||
| 185 | return rc; | 194 | return rc; |
| 186 | } | 195 | } |
| 187 | #else | 196 | #else |
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index b9d7891edaa1..50811a7dc0e0 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c | |||
| @@ -162,24 +162,31 @@ static int __smb2_reconnect(const struct nls_table *nlsc, | |||
| 162 | int rc; | 162 | int rc; |
| 163 | struct dfs_cache_tgt_list tl; | 163 | struct dfs_cache_tgt_list tl; |
| 164 | struct dfs_cache_tgt_iterator *it = NULL; | 164 | struct dfs_cache_tgt_iterator *it = NULL; |
| 165 | char tree[MAX_TREE_SIZE + 1]; | 165 | char *tree; |
| 166 | const char *tcp_host; | 166 | const char *tcp_host; |
| 167 | size_t tcp_host_len; | 167 | size_t tcp_host_len; |
| 168 | const char *dfs_host; | 168 | const char *dfs_host; |
| 169 | size_t dfs_host_len; | 169 | size_t dfs_host_len; |
| 170 | 170 | ||
| 171 | tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL); | ||
| 172 | if (!tree) | ||
| 173 | return -ENOMEM; | ||
| 174 | |||
| 171 | if (tcon->ipc) { | 175 | if (tcon->ipc) { |
| 172 | snprintf(tree, sizeof(tree), "\\\\%s\\IPC$", | 176 | snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", |
| 173 | tcon->ses->server->hostname); | 177 | tcon->ses->server->hostname); |
| 174 | return SMB2_tcon(0, tcon->ses, tree, tcon, nlsc); | 178 | rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc); |
| 179 | goto out; | ||
| 175 | } | 180 | } |
| 176 | 181 | ||
| 177 | if (!tcon->dfs_path) | 182 | if (!tcon->dfs_path) { |
| 178 | return SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc); | 183 | rc = SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc); |
| 184 | goto out; | ||
| 185 | } | ||
| 179 | 186 | ||
| 180 | rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl); | 187 | rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl); |
| 181 | if (rc) | 188 | if (rc) |
| 182 | return rc; | 189 | goto out; |
| 183 | 190 | ||
| 184 | extract_unc_hostname(tcon->ses->server->hostname, &tcp_host, | 191 | extract_unc_hostname(tcon->ses->server->hostname, &tcp_host, |
| 185 | &tcp_host_len); | 192 | &tcp_host_len); |
| @@ -199,7 +206,7 @@ static int __smb2_reconnect(const struct nls_table *nlsc, | |||
| 199 | continue; | 206 | continue; |
| 200 | } | 207 | } |
| 201 | 208 | ||
| 202 | snprintf(tree, sizeof(tree), "\\%s", tgt); | 209 | snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt); |
| 203 | 210 | ||
| 204 | rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc); | 211 | rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc); |
| 205 | if (!rc) | 212 | if (!rc) |
| @@ -216,6 +223,8 @@ static int __smb2_reconnect(const struct nls_table *nlsc, | |||
| 216 | rc = -ENOENT; | 223 | rc = -ENOENT; |
| 217 | } | 224 | } |
| 218 | dfs_cache_free_tgts(&tl); | 225 | dfs_cache_free_tgts(&tl); |
| 226 | out: | ||
| 227 | kfree(tree); | ||
| 219 | return rc; | 228 | return rc; |
| 220 | } | 229 | } |
| 221 | #else | 230 | #else |
