From: Paolo Bonzini <pbonzini@redhat.com>
To: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp>
Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org, quintela@redhat.com
Subject: Re: [Qemu-devel] Re: [PATCH] savevm: fix corruption in vmstate_subsection_load().
Date: Thu, 20 Jan 2011 10:06:55 +0100 [thread overview]
Message-ID: <4D37FB2F.1050803@redhat.com> (raw)
In-Reply-To: <AANLkTinxXP0cBhW99aNVyoZzTQ7961YoBMAqDq3Ut_Jq@mail.gmail.com>
On 01/20/2011 09:57 AM, Yoshiaki Tamura wrote:
> 2011/1/20 Paolo Bonzini<pbonzini@redhat.com>:
>> On 12/14/2010 10:07 AM, Yoshiaki Tamura wrote:
>>>
>>> Although it's rare to happen in live migration, when the head of a
>>> byte stream contains 0x05
>>
>> IIUC, this happens if you have VMS_STRUCT and the field after the VMS_STRUCT
>> starts with 0x5.
>>
>> I think you should also add this in vmstate_subsection_load:
>>
>> sub_vmsd = vmstate_get_subsection(sub, idstr);
>> if (sub_vmsd == NULL) {
>> return -ENOENT;
>> }
>> + assert (!sub_vmsd->subsections);
>> ret = vmstate_load_state(f, sub_vmsd, opaque, version_id);
>>
>> and this in vmstate_load_state:
>>
>> if (field->flags& VMS_STRUCT) {
>> + assert (!vmsd->subsections);
>> ret = vmstate_load_state(f, field->vmsd, addr,
>> field->vmsd->version_id);
>> }
>
> Hi Paolo,
>
> You mean, having subsection nested and under VMS_STRUCT are
> violations?
I believe so, because the protocol doesn't allow you to distinguish:
- in the case of nested subsections, whether 2 consecutive subsections
are siblings, or the second is nested into the first. In fact, your
patch also fixes a latent bug in case a device supports more than one
subsection, and both are present in the data stream. When
vmstate_subsection_load is called for the first subsection, it would see
a 0x5 byte (the beginning of the second subsection), eat it and then
fail with ENOENT. The second subsection would then fail to load.
- in the case of VMS_STRUCT, whether a 0x5 byte after the VMS_STRUCT is
a subsection or part of the parent data stream. This is, I believe, the
source of your bug.
I don't think it is possible to fix these problems in the file format
while preserving backwards compatibility with pre-subsection QEMU (which
was a fundamental requirement of subsections). So, I think your patch
is correct and fixes the practical bugs. However, we can be even
stronger and assert that the problematic vmstate descriptions are not used.
Even better, asserts matching the ones above could be added to
vmstate_subsection_save and vmstate_save_state, as well.
Paolo
next prev parent reply other threads:[~2011-01-20 9:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-14 9:07 [Qemu-devel] [PATCH] savevm: fix corruption in vmstate_subsection_load() Yoshiaki Tamura
2011-01-20 2:09 ` Yoshiaki Tamura
2011-01-20 8:27 ` [Qemu-devel] " Paolo Bonzini
2011-01-20 8:57 ` Yoshiaki Tamura
2011-01-20 9:06 ` Paolo Bonzini [this message]
2011-01-20 10:23 ` Yoshiaki Tamura
2011-01-24 8:48 ` Yoshiaki Tamura
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=4D37FB2F.1050803@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=tamura.yoshiaki@lab.ntt.co.jp \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).