mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/gnttab: fix gnttab_acquire_resource()
Commit9dc46386d8("gnttab: work around "may be used uninitialized" warning") was wrong, as vaddrs can legitimately be NULL in case XENMEM_resource_grant_table_id_status was specified for a grant table v1. This would result in crashes in debug builds due to ASSERT_UNREACHABLE() triggering. Check vaddrs only to be NULL in the rc == 0 case. Expand the tests in tools/tests/resource to tickle this path, and verify that using XENMEM_resource_grant_table_id_status on a v1 grant table fails. Fixes:9dc46386d8("gnttab: work around "may be used uninitialized" warning") Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> # xen Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> master commit:52daa6a848master date: 2022-09-09 16:28:38 +0100
This commit is contained in:
1 parent
182f8bb503
commit
3ac64b3751
2 files changed
+16
-1
No files matched your search
@@ -63,6 +63,21 @@ static void test_gnttab(uint32_t domid, unsigned int nr_frames)
|
||||
rc = xenforeignmemory_unmap_resource(fh, res);
|
||||
if ( rc )
|
||||
return fail(" Fail: Unmap %d - %s\n", errno, strerror(errno));
|
||||
|
||||
/*
|
||||
* Verify that an attempt to map the status frames fails, as the domain is
|
||||
* in gnttab v1 mode.
|
||||
*/
|
||||
res = xenforeignmemory_map_resource(
|
||||
fh, domid, XENMEM_resource_grant_table,
|
||||
XENMEM_resource_grant_table_id_status, 0, 1,
|
||||
(void **)&gnttab, PROT_READ | PROT_WRITE, 0);
|
||||
|
||||
if ( res )
|
||||
{
|
||||
fail(" Fail: Managed to map gnttab v2 status frames in v1 mode\n");
|
||||
xenforeignmemory_unmap_resource(fh, res);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_domain_configurations(void)
|
||||
|
||||
@@ -4138,7 +4138,7 @@ int gnttab_acquire_resource(
|
||||
* on non-error paths, and hence it needs setting to NULL at the top of the
|
||||
* function. Leave some runtime safety.
|
||||
*/
|
||||
if ( !vaddrs )
|
||||
if ( !rc && !vaddrs )
|
||||
{
|
||||
ASSERT_UNREACHABLE();
|
||||
rc = -ENODATA;
|
||||
|
||||