mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/hvm: correct hvm_ioreq_server_alloc_rangesets() failure path
Coverity-ID: 1220092 "Unsigned compare against 0" Coverity-ID: 1220093 "Out-of-bounds read" Both of these are cased by the the while() loop in the fail path, which results in an infinite loop and memory corruption from rangeset_destroy(). Move hvm_ioreq_server_free_rangesets() up and use it for cleanup on the failure path. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
This commit is contained in:
1 parent
203746bc36
commit
a310f00882
1 file changed
+13
-14
+13
-14
@@ -824,6 +824,18 @@ static void hvm_ioreq_server_unmap_pages(struct hvm_ioreq_server *s,
|
||||
}
|
||||
}
|
||||
|
||||
static void hvm_ioreq_server_free_rangesets(struct hvm_ioreq_server *s,
|
||||
bool_t is_default)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if ( is_default )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < NR_IO_RANGE_TYPES; i++ )
|
||||
rangeset_destroy(s->range[i]);
|
||||
}
|
||||
|
||||
static int hvm_ioreq_server_alloc_rangesets(struct hvm_ioreq_server *s,
|
||||
bool_t is_default)
|
||||
{
|
||||
@@ -861,24 +873,11 @@ static int hvm_ioreq_server_alloc_rangesets(struct hvm_ioreq_server *s,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
while ( --i >= 0 )
|
||||
rangeset_destroy(s->range[i]);
|
||||
hvm_ioreq_server_free_rangesets(s, 0);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void hvm_ioreq_server_free_rangesets(struct hvm_ioreq_server *s,
|
||||
bool_t is_default)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if ( is_default )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < NR_IO_RANGE_TYPES; i++ )
|
||||
rangeset_destroy(s->range[i]);
|
||||
}
|
||||
|
||||
static void hvm_ioreq_server_enable(struct hvm_ioreq_server *s,
|
||||
bool_t is_default)
|
||||
{
|
||||
|
||||