From: Oleksandr Tyshchenko Date: Thu, 20 Mar 2025 12:14:27 +0000 (+0100) Subject: xen/memory: Make resource_max_frames() to return 0 on unknown type X-Git-Tag: RELEASE-4.19.2~47 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=93027a991a89795c312e20a1c404321ce15ce404;p=xen.git 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: 9244528955de ("xen/memory: Fix acquire_resource size semantics") Signed-off-by: Oleksandr Tyshchenko Reviewed-by: Jan Beulich Reviewed-by: Andrew Cooper master commit: 9b8708290002f0a4d0b363e0c66ce945f6b520bd master date: 2025-02-18 14:47:34 +0000 --- diff --git a/tools/tests/resource/test-resource.c b/tools/tests/resource/test-resource.c index 1b10be16a6..a7f2d04643 100644 --- a/tools/tests/resource/test-resource.c +++ b/tools/tests/resource/test-resource.c @@ -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) diff --git a/xen/common/memory.c b/xen/common/memory.c index de2cc7ad92..1f0a9d7e5f 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -1156,7 +1156,7 @@ static unsigned int resource_max_frames(const struct domain *d, return d->vmtrace_size >> PAGE_SHIFT; default: - return -EOPNOTSUPP; + return 0; } } @@ -1239,6 +1239,7 @@ static int _acquire_resource( return acquire_vmtrace_buf(d, id, frame, nr_frames, mfn_list); default: + ASSERT_UNREACHABLE(); return -EOPNOTSUPP; } }