diff mbox series

[V2] xen/memory: Make resource_max_frames() to return 0 on unknown type

Message ID 20250217102741.4122367-1-olekstysh@gmail.com (mailing list archive)
State Superseded
Headers show
Series [V2] xen/memory: Make resource_max_frames() to return 0 on unknown type | expand

Commit Message

Oleksandr Tyshchenko Feb. 17, 2025, 10:27 a.m. UTC
From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>

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().

Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
  V2:
   - add R-b
   - add ASSERT_UNREACHABLE() in the default case of _acquire_resource()
     and update commit desc regarding that
   - drop post-commit remark
---
---
 xen/common/memory.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Andrew Cooper Feb. 17, 2025, 11:09 a.m. UTC | #1
On 17/02/2025 10:27 am, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>
> 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).

:(

So it broke somewhere between v3 and v8 of the original patch series,
but I can't seem to find the intervening series on lore.

Given the comment, I suspect I got inadvertently-reviewed into this bug.

> 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.

This is one of the few interfaces we have low level testing for.

tools/tests/resource/test-resource.c

Please could you add a step looking for an invalid resource id and check
you get 0 back?


> 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().

Fixes: 9244528955de ("xen/memory: Fix acquire_resource size semantics")

> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

~Andrew
Oleksandr Tyshchenko Feb. 17, 2025, 1:11 p.m. UTC | #2
On 17.02.25 13:09, Andrew Cooper wrote:


Hello Andrew


> On 17/02/2025 10:27 am, Oleksandr Tyshchenko wrote:
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>>
>> 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).
> 
> :(
> 
> So it broke somewhere between v3 and v8 of the original patch series,
> but I can't seem to find the intervening series on lore.
> 
> Given the comment, I suspect I got inadvertently-reviewed into this bug.
> 
>> 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.
> 
> This is one of the few interfaces we have low level testing for.
> 
> tools/tests/resource/test-resource.c

yes

> 
> Please could you add a step looking for an invalid resource id and check
> you get 0 back?



Sure. I was thinking where to add this step and propose the following 
change. I will send a formal patch once I find a way how to easily test 
this change.



 From 872565da55b7e87e1664714bb1b3ee84245db4a5 Mon Sep 17 00:00:00 2001
From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Date: Mon, 17 Feb 2025 14:16:50 +0200
Subject: [PATCH] tests/resource: Verify that Xen can deal with invalid
  resource type

The sign of the presence of a corresponding bugfix is an error
returned on querying the size of an unknown for Xen resource type.

Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
---
  tools/tests/resource/test-resource.c | 16 ++++++++++++++++
  1 file changed, 16 insertions(+)

diff --git a/tools/tests/resource/test-resource.c 
b/tools/tests/resource/test-resource.c
index 1b10be16a6..197477c3f3 100644
--- a/tools/tests/resource/test-resource.c
+++ b/tools/tests/resource/test-resource.c
@@ -123,6 +123,22 @@ 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);
      }
+
+    /*
+     * While at it, verify that an attempt to query the size of an unknown
+     * for Xen resource type fails. Use the highest possible value for 
variable
+     * of uint16_t type.
+     */
+    rc = xenforeignmemory_resource_size(
+        fh, domid, 65535,
+        XENMEM_resource_grant_table_id_shared, &size);
+
+    /*
+     * Success here indicates that Xen is missing the bugfix to make size
+     * requests return an error on an invalid resource type.
+     */
+    if ( !rc )
+        fail("    Fail: Expected error on an invalid resource type, got 
success\n");
  }

  static void test_domain_configurations(void)
Andrew Cooper Feb. 17, 2025, 1:52 p.m. UTC | #3
On 17/02/2025 1:11 pm, Oleksandr Tyshchenko wrote:
>
>
> On 17.02.25 13:09, Andrew Cooper wrote:
>
>
> Hello Andrew
>
>
>> On 17/02/2025 10:27 am, Oleksandr Tyshchenko wrote:
>>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>>>
>>> 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).
>>
>> :(
>>
>> So it broke somewhere between v3 and v8 of the original patch series,
>> but I can't seem to find the intervening series on lore.
>>
>> Given the comment, I suspect I got inadvertently-reviewed into this bug.
>>
>>> 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.
>>
>> This is one of the few interfaces we have low level testing for.
>>
>> tools/tests/resource/test-resource.c
>
> yes
>
>>
>> Please could you add a step looking for an invalid resource id and check
>> you get 0 back?
>
>
>
> Sure. I was thinking where to add this step and propose the following
> change. I will send a formal patch once I find a way how to easily
> test this change.
>

https://lore.kernel.org/xen-devel/cover.36ee649a8537af1a5fb5b3c5b7ffc0d8a1369969.1739496480.git-series.marmarek@invisiblethingslab.com


wires these tests up in Gitlab CI.

>
>
> From 872565da55b7e87e1664714bb1b3ee84245db4a5 Mon Sep 17 00:00:00 2001
> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
> Date: Mon, 17 Feb 2025 14:16:50 +0200
> Subject: [PATCH] tests/resource: Verify that Xen can deal with invalid
>  resource type
>
> The sign of the presence of a corresponding bugfix is an error
> returned on querying the size of an unknown for Xen resource type.
>
> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
> ---
>  tools/tests/resource/test-resource.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> diff --git a/tools/tests/resource/test-resource.c
> b/tools/tests/resource/test-resource.c
> index 1b10be16a6..197477c3f3 100644
> --- a/tools/tests/resource/test-resource.c
> +++ b/tools/tests/resource/test-resource.c
> @@ -123,6 +123,22 @@ 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);
>      }
> +
> +    /*
> +     * While at it, verify that an attempt to query the size of an
> unknown
> +     * for Xen resource type fails. Use the highest possible value
> for variable

s/for //, I think?

> +     * of uint16_t type.
> +     */
> +    rc = xenforeignmemory_resource_size(
> +        fh, domid, 65535,
> +        XENMEM_resource_grant_table_id_shared, &size);

XENMEM_resource_grant_table_id_shared should probably be 0 here.

But, I'd suggest choosing 3 (literal 3, not some kind of constant from
the headers) for the major resource number.  That has the side effect of
forcing people to extend this test case when they add a new resource type.

> +
> +    /*
> +     * Success here indicates that Xen is missing the bugfix to make
> size
> +     * requests return an error on an invalid resource type.
> +     */
> +    if ( !rc )
> +        fail("    Fail: Expected error on an invalid resource type,
> got success\n");

I'd phrase this differently.  "Check that Xen rejected the resource type."

"avoid this bug we already fixed" won't be useful to people reading this
code in the future.  It's in the commit message.

~Andrew
Oleksandr Tyshchenko Feb. 17, 2025, 8:39 p.m. UTC | #4
On 17.02.25 15:52, Andrew Cooper wrote:

Hello

> On 17/02/2025 1:11 pm, Oleksandr Tyshchenko wrote:
>>
>>
>> On 17.02.25 13:09, Andrew Cooper wrote:
>>
>>
>> Hello Andrew
>>
>>
>>> On 17/02/2025 10:27 am, Oleksandr Tyshchenko wrote:
>>>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>>>>
>>>> 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).
>>>
>>> :(
>>>
>>> So it broke somewhere between v3 and v8 of the original patch series,
>>> but I can't seem to find the intervening series on lore.
>>>
>>> Given the comment, I suspect I got inadvertently-reviewed into this bug.
>>>
>>>> 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.
>>>
>>> This is one of the few interfaces we have low level testing for.
>>>
>>> tools/tests/resource/test-resource.c
>>
>> yes
>>
>>>
>>> Please could you add a step looking for an invalid resource id and check
>>> you get 0 back?
>>
>>
>>
>> Sure. I was thinking where to add this step and propose the following
>> change. I will send a formal patch once I find a way how to easily
>> test this change.
>>
> 
> https://lore.kernel.org/xen-devel/cover.36ee649a8537af1a5fb5b3c5b7ffc0d8a1369969.1739496480.git-series.marmarek@invisiblethingslab.com
> 
> 
> wires these tests up in Gitlab CI.


thanks for the pointer.

I didn't manage to run as is. But I managed to craft something suitable 
for running just test-resource based on these patches.

> 
>>
>>
>>  From 872565da55b7e87e1664714bb1b3ee84245db4a5 Mon Sep 17 00:00:00 2001
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>> Date: Mon, 17 Feb 2025 14:16:50 +0200
>> Subject: [PATCH] tests/resource: Verify that Xen can deal with invalid
>>   resource type
>>
>> The sign of the presence of a corresponding bugfix is an error
>> returned on querying the size of an unknown for Xen resource type.
>>
>> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>> ---
>>   tools/tests/resource/test-resource.c | 16 ++++++++++++++++
>>   1 file changed, 16 insertions(+)
>>
>> diff --git a/tools/tests/resource/test-resource.c
>> b/tools/tests/resource/test-resource.c
>> index 1b10be16a6..197477c3f3 100644
>> --- a/tools/tests/resource/test-resource.c
>> +++ b/tools/tests/resource/test-resource.c
>> @@ -123,6 +123,22 @@ 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);
>>       }
>> +
>> +    /*
>> +     * While at it, verify that an attempt to query the size of an
>> unknown
>> +     * for Xen resource type fails. Use the highest possible value
>> for variable
> 
> s/for //, I think?
> 
>> +     * of uint16_t type.
>> +     */
>> +    rc = xenforeignmemory_resource_size(
>> +        fh, domid, 65535,
>> +        XENMEM_resource_grant_table_id_shared, &size);
> 
> XENMEM_resource_grant_table_id_shared should probably be 0 here.
> 
> But, I'd suggest choosing 3 (literal 3, not some kind of constant from
> the headers) for the major resource number.  That has the side effect of
> forcing people to extend this test case when they add a new resource type.
> 
>> +
>> +    /*
>> +     * Success here indicates that Xen is missing the bugfix to make
>> size
>> +     * requests return an error on an invalid resource type.
>> +     */
>> +    if ( !rc )
>> +        fail("    Fail: Expected error on an invalid resource type,
>> got success\n");
> 
> I'd phrase this differently.  "Check that Xen rejected the resource type."
> 
> "avoid this bug we already fixed" won't be useful to people reading this
> code in the future.  It's in the commit message.


Thanks for the preliminary review, I agree with the comments.

I will send a patch for the test-resource soon.

> 
> ~Andrew
diff mbox series

Patch

diff --git a/xen/common/memory.c b/xen/common/memory.c
index a6f2f6d1b3..8ca4e1a842 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -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;
     }
 }