From: Anthony Liguori <aliguori@us.ibm.com>
To: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Cc: Amit Shah <amit.shah@redhat.com>,
"Justin M. Forbes" <jmforbes@linuxtx.org>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] qed: fix use-after-free during l2 cache commit
Date: Wed, 05 Oct 2011 11:17:39 -0500 [thread overview]
Message-ID: <4E8C8323.1060605@us.ibm.com> (raw)
In-Reply-To: <1317379151-11557-1-git-send-email-stefanha@linux.vnet.ibm.com>
On 09/30/2011 05:39 AM, Stefan Hajnoczi wrote:
> QED's metadata caching strategy allows two parallel requests to race for
> metadata lookup. The first one to complete will populate the metadata
> cache and the second one will drop the data it just read in favor of the
> cached data.
>
> There is a use-after-free in qed_read_l2_table_cb() and
> qed_commit_l2_update() where l2_table->offset was used after the
> l2_table may have been freed due to a metadata lookup race. Fix this by
> keeping the l2_offset in a local variable and not reaching into the
> possibly freed l2_table.
>
> Reported-by: Amit Shah<amit.shah@redhat.com>
> Signed-off-by: Stefan Hajnoczi<stefanha@linux.vnet.ibm.com>
Applied. Thanks.
Regards,
Anthony Liguori
> ---
> Hi Amit,
> Thanks for reporting the assertion failure you saw at http://fpaste.org/CDuv/.
> Does this patch fix the problem?
>
> If not, please send details on your setup and how to reproduce the issue.
>
> Thanks,
> Stefan
>
> block/qed-table.c | 6 +++---
> block/qed.c | 4 ++--
> 2 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/block/qed-table.c b/block/qed-table.c
> index d96afa8..f31f9ff 100644
> --- a/block/qed-table.c
> +++ b/block/qed-table.c
> @@ -222,21 +222,21 @@ static void qed_read_l2_table_cb(void *opaque, int ret)
> QEDRequest *request = read_l2_table_cb->request;
> BDRVQEDState *s = read_l2_table_cb->s;
> CachedL2Table *l2_table = request->l2_table;
> + uint64_t l2_offset = read_l2_table_cb->l2_offset;
>
> if (ret) {
> /* can't trust loaded L2 table anymore */
> qed_unref_l2_cache_entry(l2_table);
> request->l2_table = NULL;
> } else {
> - l2_table->offset = read_l2_table_cb->l2_offset;
> + l2_table->offset = l2_offset;
>
> qed_commit_l2_cache_entry(&s->l2_cache, l2_table);
>
> /* This is guaranteed to succeed because we just committed the entry
> * to the cache.
> */
> - request->l2_table = qed_find_l2_cache_entry(&s->l2_cache,
> - l2_table->offset);
> + request->l2_table = qed_find_l2_cache_entry(&s->l2_cache, l2_offset);
> assert(request->l2_table != NULL);
> }
>
> diff --git a/block/qed.c b/block/qed.c
> index 624e261..e87dc4d 100644
> --- a/block/qed.c
> +++ b/block/qed.c
> @@ -911,14 +911,14 @@ static void qed_commit_l2_update(void *opaque, int ret)
> QEDAIOCB *acb = opaque;
> BDRVQEDState *s = acb_to_s(acb);
> CachedL2Table *l2_table = acb->request.l2_table;
> + uint64_t l2_offset = l2_table->offset;
>
> qed_commit_l2_cache_entry(&s->l2_cache, l2_table);
>
> /* This is guaranteed to succeed because we just committed the entry to the
> * cache.
> */
> - acb->request.l2_table = qed_find_l2_cache_entry(&s->l2_cache,
> - l2_table->offset);
> + acb->request.l2_table = qed_find_l2_cache_entry(&s->l2_cache, l2_offset);
> assert(acb->request.l2_table != NULL);
>
> qed_aio_next_io(opaque, ret);
prev parent reply other threads:[~2011-10-05 16:17 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-30 10:39 [Qemu-devel] [PATCH] qed: fix use-after-free during l2 cache commit Stefan Hajnoczi
2011-09-30 11:27 ` Amit Shah
2011-09-30 15:23 ` Stefan Hajnoczi
2011-09-30 15:49 ` Amit Shah
2011-10-11 14:22 ` Kevin Wolf
2011-10-12 7:53 ` Stefan Hajnoczi
2011-09-30 15:26 ` Stefan Hajnoczi
2011-10-03 19:53 ` Anthony Liguori
2011-10-05 16:17 ` Anthony Liguori [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=4E8C8323.1060605@us.ibm.com \
--to=aliguori@us.ibm.com \
--cc=amit.shah@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
/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).