34 lines
1.4 KiB
Diff
34 lines
1.4 KiB
Diff
|
References: bnc#842515 CVE-2013-4375 XSA-71
|
||
|
|
||
|
xen_disk: mark ioreq as mapped before unmapping in error case
|
||
|
|
||
|
Commit c6961b7d ("xen_disk: use bdrv_aio_flush instead of bdrv_flush")
|
||
|
modified the semantics of ioreq_{un,}map so that they are idempotent if
|
||
|
called when they're not needed (ie., twice in a row). However, it neglected
|
||
|
to handle the case where batch mapping is not being used (the default), and
|
||
|
one of the grants fails to map. In this case, ioreq_unmap will be called to
|
||
|
unwind and unmap any mappings already performed, but ioreq_unmap simply
|
||
|
returns due to the aforementioned change (the ioreq has not already been
|
||
|
marked as mapped).
|
||
|
|
||
|
The frontend user can therefore force xen_disk to leak grant mappings, a
|
||
|
per-backend-domain limited resource.
|
||
|
|
||
|
Fix by marking the ioreq as mapped before calling ioreq_unmap in this
|
||
|
situation.
|
||
|
|
||
|
This is XSA-71 / CVE-2013-4375
|
||
|
|
||
|
Signed-off-by: Matthew Daley <mattjd@gmail.com>
|
||
|
|
||
|
--- a/tools/qemu-xen-dir-remote/hw/xen_disk.c
|
||
|
+++ b/tools/qemu-xen-dir-remote/hw/xen_disk.c
|
||
|
@@ -406,6 +406,7 @@ static int ioreq_map(struct ioreq *ioreq
|
||
|
xen_be_printf(&ioreq->blkdev->xendev, 0,
|
||
|
"can't map grant ref %d (%s, %d maps)\n",
|
||
|
refs[i], strerror(errno), ioreq->blkdev->cnt_map);
|
||
|
+ ioreq->mapped = 1;
|
||
|
ioreq_unmap(ioreq);
|
||
|
return -1;
|
||
|
}
|