All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org, jsnow@redhat.com, qemu-block@nongnu.org,
	thuth@redhat.com, f4bug@amsat.org
Subject: Re: [Qemu-devel] [PATCH for-2.11] ide: ahci: unparent children buses before freeing their memory
Date: Mon, 28 Aug 2017 21:08:14 +0300	[thread overview]
Message-ID: <20170828210709-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1503938085-169486-1-git-send-email-imammedo@redhat.com>

On Mon, Aug 28, 2017 at 06:34:45PM +0200, Igor Mammedov wrote:
> Fixes read after freeing error reported
>   https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg04243.html
>   Message-Id: <59a56959-ca12-ea75-33fa-ff07eba1b090@redhat.com>
> 
> ich9-ahci device creates ide buses and attaches them as QOM children
> at realize time, however it forgets to properly clean them up
> at unrealize time and frees memory containing these children,
> with following call-chain:
> 
>    qdev_device_add()
>      object_property_set_bool('realized', true)
>        device_set_realized()
>           ...
>           pci_qdev_realize() -> pci_ich9_ahci_realize() -> ahci_realize()
>                ...
>                s->dev = g_new0(AHCIDevice, ports);
>                ...
>                   AHCIDevice *ad = &s->dev[i];
>                   ide_bus_new(&ad->port, sizeof(ad->port), qdev, i, 1);
>                   ^^^ creates bus in memory allocated by above gnew()
>                       and adds it as child propety to ahci device
>           ...
>           hotplug_handler_plug(); -> goto post_realize_fail;
>           pci_qdev_unrealize() -> pci_ich9_uninit() -> ahci_uninit()
>               ...
>                g_free(s->dev);
>                ^^^ free memory that holds children busses
> 
>           return with error from device_set_realized()
> 
> As result later when qdev_device_add() tries to unparent ich9-ahci
> after failed device_set_realized(),
>     object_unparent() -> object_property_del_child()
> iterates over existing QOM children including buses added by
> ide_bus_new() and tries to unparent them, which causes access to
> freed memory where they where located.
> 
> Reported-by: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

Pls merge through ide tree.

> ---
>  hw/ide/ahci.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index 406a1b5..ccbe091 100644
> --- a/hw/ide/ahci.c
> +++ b/hw/ide/ahci.c
> @@ -1495,6 +1495,7 @@ void ahci_uninit(AHCIState *s)
>  
>              ide_exit(s);
>          }
> +        object_unparent(OBJECT(&ad->port));
>      }
>  
>      g_free(s->dev);
> -- 
> 2.7.4

  parent reply	other threads:[~2017-08-28 18:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-28 16:34 [Qemu-devel] [PATCH for-2.11] ide: ahci: unparent children buses before freeing their memory Igor Mammedov
2017-08-28 16:59 ` Philippe Mathieu-Daudé
2017-08-28 17:56 ` Thomas Huth
2017-08-28 18:08 ` Michael S. Tsirkin [this message]
2017-08-28 22:41 ` John Snow

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=20170828210709-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=imammedo@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.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 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.