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:
Andrew Cooper authored and Jan Beulich committed 2014-06-05 17:43:26 +02:00
1 parent 203746bc36
commit a310f00882
1 file changed
+13 -14
+13 -14
View File
@@ -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)
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.