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:
Oleksandr Tyshchenko authored and Andrew Cooper committed 2025-02-18 14:47:34 +00:00
1 parent 81f8b1dd94
commit 9b87082900
2 files changed
+12 -1

No files matched your search

+10
View File
@@ -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
View File
@@ -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;
}
}
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.