mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/memory: Make resource_max_frames() to return 0 on unknown type
This is actually what the caller acquire_resource() expects on any kind
of error (the comment on top of resource_max_frames() also suggests that).
Otherwise, the caller will treat -errno as a valid value and propagate incorrect
nr_frames to the VM. As a possible consequence, a VM trying to query a resource
size of an unknown type will get the success result from the hypercall and obtain
nr_frames 4294967201.
Also, add an ASSERT_UNREACHABLE() in the default case of _acquire_resource(),
normally we won't get to this point, as an unknown type will always be rejected
earlier in resource_max_frames().
Also, update test-resource app to verify that Xen can deal with invalid
(unknown) resource type properly.
Fixes: 9244528955 ("xen/memory: Fix acquire_resource size semantics")
Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
This commit is contained in:
1 parent
81f8b1dd94
commit
9b87082900
2 files changed
+12
-1
No files matched your search
@@ -123,6 +123,16 @@ static void test_gnttab(uint32_t domid, unsigned int nr_frames,
|
||||
fail(" Fail: Managed to map gnttab v2 status frames in v1 mode\n");
|
||||
xenforeignmemory_unmap_resource(fh, res);
|
||||
}
|
||||
|
||||
/*
|
||||
* If this check starts failing, you've found the right place to test your
|
||||
* addition to the Acquire Resource infrastructure.
|
||||
*/
|
||||
rc = xenforeignmemory_resource_size(fh, domid, 3, 0, &size);
|
||||
|
||||
/* Check that Xen rejected the resource type. */
|
||||
if ( !rc )
|
||||
fail(" Fail: Expected error on an invalid resource type, got success\n");
|
||||
}
|
||||
|
||||
static void test_domain_configurations(void)
|
||||
|
||||
+2
-1
@@ -1157,7 +1157,7 @@ static unsigned int resource_max_frames(const struct domain *d,
|
||||
return d->vmtrace_size >> PAGE_SHIFT;
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1240,6 +1240,7 @@ static int _acquire_resource(
|
||||
return acquire_vmtrace_buf(d, id, frame, nr_frames, mfn_list);
|
||||
|
||||
default:
|
||||
ASSERT_UNREACHABLE();
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||