aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-05-31 16:49:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-31 16:49:50 -0400
commit41e7231fab9d76e906b6d8abe09c44c7b9656d33 (patch)
treef250117954733a4827e5dd9b313c52314895da91
parentd266b3f5cac09434eb624af202f9a31307b34a88 (diff)
parent31fad7d41e73731f05b8053d17078638cf850fa6 (diff)
Merge tag 'v5.2-rc2-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
Pull cifs fixes from Steve French: "Four small smb3 fixes, one for stable" * tag 'v5.2-rc2-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: CIFS: cifs_read_allocate_pages: don't iterate through whole page array on ENOMEM dfs_cache: fix a wrong use of kfree in flush_cache_ent() fs/cifs/smb2pdu.c: fix buffer free in SMB2_ioctl_free cifs: fix memory leak of pneg_inbuf on -EOPNOTSUPP ioctl case
-rw-r--r--fs/cifs/dfs_cache.c4
-rw-r--r--fs/cifs/file.c4
-rw-r--r--fs/cifs/smb2pdu.c9
3 files changed, 11 insertions, 6 deletions
diff --git a/fs/cifs/dfs_cache.c b/fs/cifs/dfs_cache.c
index 85dc89d3a203..e3e1c13df439 100644
--- a/fs/cifs/dfs_cache.c
+++ b/fs/cifs/dfs_cache.c
@@ -132,7 +132,7 @@ static inline void flush_cache_ent(struct dfs_cache_entry *ce)
132 return; 132 return;
133 133
134 hlist_del_init_rcu(&ce->ce_hlist); 134 hlist_del_init_rcu(&ce->ce_hlist);
135 kfree(ce->ce_path); 135 kfree_const(ce->ce_path);
136 free_tgts(ce); 136 free_tgts(ce);
137 dfs_cache_count--; 137 dfs_cache_count--;
138 call_rcu(&ce->ce_rcu, free_cache_entry); 138 call_rcu(&ce->ce_rcu, free_cache_entry);
@@ -422,7 +422,7 @@ alloc_cache_entry(const char *path, const struct dfs_info3_param *refs,
422 422
423 rc = copy_ref_data(refs, numrefs, ce, NULL); 423 rc = copy_ref_data(refs, numrefs, ce, NULL);
424 if (rc) { 424 if (rc) {
425 kfree(ce->ce_path); 425 kfree_const(ce->ce_path);
426 kmem_cache_free(dfs_cache_slab, ce); 426 kmem_cache_free(dfs_cache_slab, ce);
427 ce = ERR_PTR(rc); 427 ce = ERR_PTR(rc);
428 } 428 }
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index ce9a5be11df5..06e27ac6d82c 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -3216,7 +3216,9 @@ cifs_read_allocate_pages(struct cifs_readdata *rdata, unsigned int nr_pages)
3216 } 3216 }
3217 3217
3218 if (rc) { 3218 if (rc) {
3219 for (i = 0; i < nr_pages; i++) { 3219 unsigned int nr_page_failed = i;
3220
3221 for (i = 0; i < nr_page_failed; i++) {
3220 put_page(rdata->pages[i]); 3222 put_page(rdata->pages[i]);
3221 rdata->pages[i] = NULL; 3223 rdata->pages[i] = NULL;
3222 } 3224 }
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 710ceb875161..29b699d532ef 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -1054,7 +1054,8 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
1054 * not supported error. Client should accept it. 1054 * not supported error. Client should accept it.
1055 */ 1055 */
1056 cifs_dbg(VFS, "Server does not support validate negotiate\n"); 1056 cifs_dbg(VFS, "Server does not support validate negotiate\n");
1057 return 0; 1057 rc = 0;
1058 goto out_free_inbuf;
1058 } else if (rc != 0) { 1059 } else if (rc != 0) {
1059 cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc); 1060 cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc);
1060 rc = -EIO; 1061 rc = -EIO;
@@ -2619,10 +2620,12 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
2619void 2620void
2620SMB2_ioctl_free(struct smb_rqst *rqst) 2621SMB2_ioctl_free(struct smb_rqst *rqst)
2621{ 2622{
2623 int i;
2622 if (rqst && rqst->rq_iov) { 2624 if (rqst && rqst->rq_iov) {
2623 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ 2625 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */
2624 if (rqst->rq_iov[1].iov_len) 2626 for (i = 1; i < rqst->rq_nvec; i++)
2625 kfree(rqst->rq_iov[1].iov_base); 2627 if (rqst->rq_iov[i].iov_base != smb2_padding)
2628 kfree(rqst->rq_iov[i].iov_base);
2626 } 2629 }
2627} 2630}
2628 2631