diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-31 16:49:50 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-31 16:49:50 -0400 |
| commit | 41e7231fab9d76e906b6d8abe09c44c7b9656d33 (patch) | |
| tree | f250117954733a4827e5dd9b313c52314895da91 | |
| parent | d266b3f5cac09434eb624af202f9a31307b34a88 (diff) | |
| parent | 31fad7d41e73731f05b8053d17078638cf850fa6 (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.c | 4 | ||||
| -rw-r--r-- | fs/cifs/file.c | 4 | ||||
| -rw-r--r-- | fs/cifs/smb2pdu.c | 9 |
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, | |||
| 2619 | void | 2620 | void |
| 2620 | SMB2_ioctl_free(struct smb_rqst *rqst) | 2621 | SMB2_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 | ||
