“3ad44d2ae574c8a88ea943c06492e94e60889900”上不存在“git@gitcode.net:bing_bg/gpt-prompt.git”
提交 4abd2c44 编写于 作者: J Jan Beulich 提交者: Cheng Jian

xen-blkback: fix error handling in xen_blkbk_map()

stable inclusion
from linux-4.19.177
commit 98f16e171e2849dba76e2e0346e914452c030dc5
CVE: CVE-2021-26930

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

commit 871997bc upstream.

The function uses a goto-based loop, which may lead to an earlier error
getting discarded by a later iteration. Exit this ad-hoc loop when an
error was encountered.

The out-of-memory error path additionally fails to fill a structure
field looked at by xen_blkbk_unmap_prepare() before inspecting the
handle which does get properly set (to BLKBACK_INVALID_HANDLE).

Since the earlier exiting from the ad-hoc loop requires the same field
filling (invalidation) as that on the out-of-memory path, fold both
paths. While doing so, drop the pr_alert(), as extra log messages aren't
going to help the situation (the kernel will log oom conditions already
anyway).

This is XSA-365.
Signed-off-by: NJan Beulich <jbeulich@suse.com>
Reviewed-by: NJuergen Gross <jgross@suse.com>
Reviewed-by: NJulien Grall <julien@xen.org>
Signed-off-by: NJuergen Gross <jgross@suse.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: NXiu Jianfeng <xiujianfeng@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NCheng Jian <cj.chengjian@huawei.com>
上级 f68c741c
...@@ -850,8 +850,11 @@ static int xen_blkbk_map(struct xen_blkif_ring *ring, ...@@ -850,8 +850,11 @@ static int xen_blkbk_map(struct xen_blkif_ring *ring,
pages[i]->page = persistent_gnt->page; pages[i]->page = persistent_gnt->page;
pages[i]->persistent_gnt = persistent_gnt; pages[i]->persistent_gnt = persistent_gnt;
} else { } else {
if (get_free_page(ring, &pages[i]->page)) if (get_free_page(ring, &pages[i]->page)) {
goto out_of_memory; put_free_pages(ring, pages_to_gnt, segs_to_map);
ret = -ENOMEM;
goto out;
}
addr = vaddr(pages[i]->page); addr = vaddr(pages[i]->page);
pages_to_gnt[segs_to_map] = pages[i]->page; pages_to_gnt[segs_to_map] = pages[i]->page;
pages[i]->persistent_gnt = NULL; pages[i]->persistent_gnt = NULL;
...@@ -935,17 +938,18 @@ static int xen_blkbk_map(struct xen_blkif_ring *ring, ...@@ -935,17 +938,18 @@ static int xen_blkbk_map(struct xen_blkif_ring *ring,
} }
segs_to_map = 0; segs_to_map = 0;
last_map = map_until; last_map = map_until;
if (map_until != num) if (!ret && map_until != num)
goto again; goto again;
return ret; out:
for (i = last_map; i < num; i++) {
out_of_memory: /* Don't zap current batch's valid persistent grants. */
pr_alert("%s: out of memory\n", __func__); if(i >= last_map + segs_to_map)
put_free_pages(ring, pages_to_gnt, segs_to_map); pages[i]->persistent_gnt = NULL;
for (i = last_map; i < num; i++)
pages[i]->handle = BLKBACK_INVALID_HANDLE; pages[i]->handle = BLKBACK_INVALID_HANDLE;
return -ENOMEM; }
return ret;
} }
static int xen_blkbk_map_seg(struct pending_req *pending_req) static int xen_blkbk_map_seg(struct pending_req *pending_req)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册