All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Jason Andryuk <andryuk@aero.org>
Cc: xen-devel@lists.xen.org, Ian Jackson <ian.jackson@eu.citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [PATCH] libxc: Protect xc_domain_resume from clobbering domain registers
Date: Tue, 20 May 2014 14:16:18 +0100	[thread overview]
Message-ID: <537B55A2.9030808@citrix.com> (raw)
In-Reply-To: <537B4FDC.6060200@aero.org>

On 20/05/14 13:51, Jason Andryuk wrote:
> On 5/20/2014 5:53 AM, Andrew Cooper wrote:
>> On 19/05/14 19:37, Jason Andryuk wrote:
>>> xc_domain_resume() expects the guest to be in state SHUTDOWN_suspend.
>>> However, nothing verifies the state before modify_returncode() modifies
>>> the domain's registers.  This will crash guest processes or the kernel
>>> itself.
>>>
>>> This can be demonstrated with `LIBXL_SAVE_HELPER=/bin/false xl migrate`.
>>>
>>> Signed-off-by: Jason Andryuk <andryuk@aero.org>
>>> ---
>>> Changes since RFC:
>>>   - Return -1 from modify_returncode
>>>   - Set errno to EINVAL
>>> ---
>>>   tools/libxc/xc_resume.c | 7 +++++++
>>>   1 file changed, 7 insertions(+)
>>>
>>> diff --git a/tools/libxc/xc_resume.c b/tools/libxc/xc_resume.c
>>> index 18b4818..2163ad9 100644
>>> --- a/tools/libxc/xc_resume.c
>>> +++ b/tools/libxc/xc_resume.c
>>> @@ -39,6 +39,13 @@ static int modify_returncode(xc_interface *xch, uint32_t domid)
>>>           return -1;
>>>       }
>> Having looked at this more closely, there is also a bug in the hunk above.
>>
>> xc_domain_getinfo() being the 'special' function that it is doesn't
>> always return the domain specified.  If the given domid doesn't exist in
>> the system, you will get back the first domain with a higher domid.
>>
>> The only safe way to use it is
>>
>> if ( xc_domain_getinfo(xch, domid, 1, &info) != 1 ||
>>       info.domid != domid )
>> {
>>      error...
>> }
> I am ok making this change; I wasn't aware of the quirks of the function.
>
> This patch copy & pasted the check from xc_domain_save.c:suspend_and_state().  That and other locations throughout libxc fail to compare info.domid to the requested domid, so there are lots of places that should be fixed up.  Maybe a wrapper xc_domain_getinfo_one(xch, domid, &info) that checks the domid would be useful?

It certainly would be useful, although probably as a separate patch.

>
>>>   
>>> +    if ( !info.shutdown || (info.shutdown_reason != SHUTDOWN_suspend) )
>>> +    {
>>> +        ERROR("Domain not in suspended state");
>> ERROR("Dom %d not suspended: (shutdown %d, reason %d)", domid,
>> info.shutdown, info.shutdown_reason));
>>
>> This way, someone unexpectedly finding this error message gets slightly
>> more information than "something wasn't how I expected it to be".
> Yes, this is more informative.  suspend_and_state could also be updated to the same message.
>
> -Jason

Probably no need to worry about suspend_and_state().  It is about to
disappear with the new migration protocol work.

~Andrew

      reply	other threads:[~2014-05-20 13:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-19 18:37 [PATCH] libxc: Protect xc_domain_resume from clobbering domain registers Jason Andryuk
2014-05-20  9:53 ` Andrew Cooper
2014-05-20 12:51   ` Jason Andryuk
2014-05-20 13:16     ` Andrew Cooper [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=537B55A2.9030808@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=andryuk@aero.org \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.