[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] domain: fix misaligned unmap address in unmap_guest_area()


  • To: Julien Grall <julien@xxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Fri, 6 Oct 2023 12:47:55 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=iKA/wEn/ogry3aoge0788jmxuEqv0FIPsFGfzdUssm8=; b=ltibYv+QQV6/5MSDkQ5DVyvclc0U7BejgSswL3NBGnl+phyDmCguVGcJ8cAL48OvRB80n8nuC8nHoP0WzbzW1K9c1FUqX7Om35RQ6uUwFnxun0R+PietoMxzB6Hn3uZdbA4TtyT6loXAbHf/QiRqbI0vSv0rRCK7s0g5ZgD2MEd45SHRjSJ+8bb/2kJtJfPvVqb8RQW19SQdrAdmn8GFXsgKr1cfwAZW+ifdLaU3R0/JBz0yfl4qFKvvDAY5rPh17ltFFvIxOk8KRhVrKLsJKAqjHWqih0KlLtWu+HHF/peP+M+qkWH3gv7Z3owiR12rASHeLuG7jRn/cCWIMdabJA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EvZb7BLOzbZNQXnNxbe+fKgoRt8pztyoF3smhtrFwgmagAMmTm4FliuaxNMJoarofqLne9nH39xrgmIssO0E46urXHosZvzIKwuNVgg+B6qjO7H032SlN4zfDvJJY6VS7AstAPCyDBO246hgED7pRnoX0/r76mOYy1FnrQva7W/WUOyaIDFn6GFtZYyDUKizYKys0Ig4cWP3tRJL+Y+njZLPb8s8gVOMra+m65k6Luhh8cQuVbLtc0CO7WiiDs76luwGPhBAsQx3g0SilxcaIIt2l6VSl5fRYrb0iHXoBb+OP+WtGqTSF2O4MUCOVWbyGD83/kHLOgIa09d7+vZiEQ==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx, Henry Wang <Henry.Wang@xxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Fri, 06 Oct 2023 10:48:18 +0000
  • Ironport-data: A9a23:ZBJvkK+9FugYJnbWrITQDrUDWn+TJUtcMsCJ2f8bNWPcYEJGY0x3z mofWj3QOvqCZDfxKI8laoS3/R5VvMWGz9ZqHAM//C08E34SpcT7XtnIdU2Y0wF+jCHgZBk+s 5hBMImowOQcFCK0SsKFa+C5xZVE/fjVAOK6UKidYnwZqTZMEE8JkQhkl/MynrlmiN24BxLlk d7pqojUNUTNNwRcawr40Ird7ks01BjOkGlA5AdnPagW5AW2e0Q9V/rzG4ngdxMUfaEMdgKKb 76r5K20+Grf4yAsBruN+losWhRXKlJ6FVHmZkt+A8BOsDAbzsAB+v9T2M4nQVVWk120c+VZk 72hg3ASpTABZcUgkMxFO/VR/roX0aduoNcrKlDn2SCfItGvn9IBDJyCAWlvVbD09NqbDklp6 90DBm4tTSqhnrKN/pSXG8x8gcUseZyD0IM34hmMzBn/JNN/GNXvZvuP4tVVmjAtmspJAPDSI dIDbiZiZwjBZBsJPUoLDJU5n6GjgXyXnz9w8QrJ4/ZopTWMilUujtABM/KMEjCObd9SkUuC4 HrP4kzyAw0ANczZwj2Amp6prraVwn6kCdtCT9VU8NZj2nChxX4IVCEzenblgPKc2neRR/BAf hl8Fi0G6PJaGFaQZtvgWxy1plaUsxhaXMBfe8Uq5QfIxqfK7gKxAmkfUiUHeNEgrNUxRzEhy hmOhdyBLRxitqeED02U8Li8pCm3fyMSKAcqZyUJUA8E6NnLu5wog1TESdMLOLWuktT/FDX0w jaLhCsznbMeiYgMzarT1U/DqyKhoN7OVAFd2+nMdmes7wc8aIv7YYWtsAHf9awZc9jfSUSdt n8ZncTY9PoJEZyGiC2KRqMKAa2t4PGGdjbbhDaDAqUcythkwFb7Fag43d20DBwB3hosEdMxX HLuhA==
  • Ironport-hdrordr: A9a23:tJRfuajVKyx7khyX+aM2K/wvs3BQXgMji2hC6mlwRA09TyX4ra yTdZEgviMc5wx/ZJheo7690cW7IE8036QU3WBpB8bAYOC+ghrLEGgA1/qG/9SfIVybygcH79 YGT0EWMrSZMbEdt7ed3ODSKbsdKbe8mpxBcY3lvg5QpHlRGtldB4wTMHfhLqX9LzM2f6bQrf Gnl7d6mwY=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Fri, Oct 06, 2023 at 11:08:09AM +0100, Julien Grall wrote:
> Hi Roger,
> 
> On 06/10/2023 10:13, Roger Pau Monne wrote:
> > unmap_domain_page_global() expects the provided address to be page aligned, 
> > or
> > else some of the called functions will trigger assertions, like
> > modify_xen_mappings() on x86 or destroy_xen_mappings() on Arm.
> > 
> > The following assert has been reported by osstest arm 32bit tests:
> > 
> > (XEN) Assertion 'IS_ALIGNED(s, PAGE_SIZE)' failed at arch/arm/mm.c:1243
> > (XEN) ----[ Xen-4.18-rc  arm32  debug=y  Not tainted ]----
> > (XEN) CPU:    0
> > (XEN) PC:     00271a38 destroy_xen_mappings+0x50/0x5c
> > [...]
> > (XEN) Xen call trace:
> > (XEN)    [<00271a38>] destroy_xen_mappings+0x50/0x5c (PC)
> > (XEN)    [<00235aa8>] vunmap+0x30/0x1a0 (LR)
> > (XEN)    [<0026ad88>] unmap_domain_page_global+0x10/0x20
> > (XEN)    [<00208e38>] unmap_guest_area+0x90/0xec
> > (XEN)    [<00208f98>] domain_kill+0x104/0x180
> > (XEN)    [<00239e3c>] do_domctl+0x8ac/0x14fc
> > (XEN)    [<0027ae34>] do_trap_guest_sync+0x570/0x66c
> > (XEN)    [<002019f0>] arch/arm/arm32/entry.o#return_from_trap+0/0x4
> > 
> > Fixes: eadc288cbb0d ('domain: map/unmap GADDR based shared guest areas')
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> > ---
> > unmap_domain_page_global() and vunmap() should likely have the same 
> > alignment
> > asserts, as not all paths lead to detecting the misalignment of the provided
> > linear address.  Will do a separate patch.
> 
> unmap_domain_page() seems to be able to deal with unaligned pointer. And
> supporting unaligned pointer in vunmap()/unmap_domain_page_global() would
> simplifyy call to those functions.
> 
> So I would consider to deal with the alignment rather than adding ASSERT()
> in the two functions. destroy_xen_mappings() and modify_xen_mappings()
> should stay as-is though.
> 
> Anyway, I don't think this is a 4.18 material.

Maybe, I don't really have a strong opinion.  It seems more sane to me
to expect a page aligned linear address if the function is unmapping a
page, leaves less room for misuse IMO.

> > ---
> >   xen/common/domain.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/xen/common/domain.c b/xen/common/domain.c
> > index b8281d7cff9d..2dcc64e659cc 100644
> > --- a/xen/common/domain.c
> > +++ b/xen/common/domain.c
> > @@ -1634,7 +1634,7 @@ void unmap_guest_area(struct vcpu *v, struct 
> > guest_area *area)
> >       if ( pg )
> >       {
> > -        unmap_domain_page_global(map);
> > +        unmap_domain_page_global((void *)((unsigned long)map & PAGE_MASK));
> 
> Looking at the code, I can't find where 'map' may have become unaligned. Do
> you have a pointer?

In map_guest_area(), there's:

if ( ~gaddr ) /* Map (i.e. not just unmap)? */
{
    [...]
    map = __map_domain_page_global(pg);
    if ( !map )
    {
        put_page_and_type(pg);
        return -ENOMEM;
    }
    map += PAGE_OFFSET(gaddr);
}

> Depending on the answer, the call in map_guest_area() may also need some
> adjustment.

Indeed, I've missed that one, let me spin v2.

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.