提交 2c8a0041 编写于 作者: Z ZhangXiaoxu 提交者: Xie XiuQi

CIFS: Fix possible oops and memory leaks in async IO

mainline inclusion
from mainline-v5.0-rc4-4-g9bda8723
commit 9bda8723
category: bugfix
bugzilla: 7426
CVE: NA

-------------------------------------------------

Allocation of a page array for non-cached IO was separated from
allocation of rdata and wdata structures and this introduced memory
leaks and a possible null pointer dereference. This patch fixes
these problems.

conflict:
	fs/cifs/file.c

Cc: <stable@vger.kernel.org>
Signed-off-by: NPavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: NSteve French <stfrench@microsoft.com>
Signed-off-by: NZhangXiaoxu <zhangxiaoxu5@huawei.com>
Reviewed-by: NMiao Xie <miaoxie@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 50440213
...@@ -2564,6 +2564,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from, ...@@ -2564,6 +2564,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from,
rc = cifs_write_allocate_pages(wdata->pages, nr_pages); rc = cifs_write_allocate_pages(wdata->pages, nr_pages);
if (rc) { if (rc) {
kvfree(wdata->pages);
kfree(wdata); kfree(wdata);
add_credits_and_wake_if(server, credits, 0); add_credits_and_wake_if(server, credits, 0);
break; break;
...@@ -2574,6 +2575,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from, ...@@ -2574,6 +2575,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from,
if (rc) { if (rc) {
for (i = 0; i < nr_pages; i++) for (i = 0; i < nr_pages; i++)
put_page(wdata->pages[i]); put_page(wdata->pages[i]);
kvfree(wdata->pages);
kfree(wdata); kfree(wdata);
add_credits_and_wake_if(server, credits, 0); add_credits_and_wake_if(server, credits, 0);
break; break;
...@@ -3130,8 +3132,12 @@ cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file, ...@@ -3130,8 +3132,12 @@ cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file,
} }
rc = cifs_read_allocate_pages(rdata, npages); rc = cifs_read_allocate_pages(rdata, npages);
if (rc) if (rc) {
goto error; kvfree(rdata->pages);
kfree(rdata);
add_credits_and_wake_if(server, credits, 0);
break;
}
rdata->cfile = cifsFileInfo_get(open_file); rdata->cfile = cifsFileInfo_get(open_file);
rdata->nr_pages = npages; rdata->nr_pages = npages;
...@@ -3149,7 +3155,6 @@ cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file, ...@@ -3149,7 +3155,6 @@ cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file,
if (!rdata->cfile->invalidHandle || if (!rdata->cfile->invalidHandle ||
!(rc = cifs_reopen_file(rdata->cfile, true))) !(rc = cifs_reopen_file(rdata->cfile, true)))
rc = server->ops->async_readv(rdata); rc = server->ops->async_readv(rdata);
error:
if (rc) { if (rc) {
add_credits_and_wake_if(server, rdata->credits, 0); add_credits_and_wake_if(server, rdata->credits, 0);
kref_put(&rdata->refcount, kref_put(&rdata->refcount,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册