Skip to content

Commit

Permalink
xen/memory: Make resource_max_frames() to return 0 on unknown type
Browse files Browse the repository at this point in the history
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: 9244528 ("xen/memory: Fix acquire_resource size semantics")
Signed-off-by: Oleksandr Tyshchenko <[email protected]>
Reviewed-by: Jan Beulich <[email protected]>
Reviewed-by: Andrew Cooper <[email protected]>
Release-Acked-by: Oleksii Kurochko <[email protected]>
  • Loading branch information
Oleksandr Tyshchenko authored and andyhhp committed Feb 18, 2025
1 parent 81f8b1d commit 9b87082
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 1 deletion.
10 changes: 10 additions & 0 deletions tools/tests/resource/test-resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion xen/common/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -1240,6 +1240,7 @@ static int _acquire_resource(
return acquire_vmtrace_buf(d, id, frame, nr_frames, mfn_list);

default:
ASSERT_UNREACHABLE();
return -EOPNOTSUPP;
}
}
Expand Down

0 comments on commit 9b87082

Please sign in to comment.