[libvirt] Crash while using virConnectRef

Daniel P. Berrange berrange at redhat.com
Tue Aug 11 09:33:06 UTC 2009


On Mon, Aug 10, 2009 at 01:27:06PM +0200, Chris Lalancette wrote:
> All,
>      I've been doing some testing of the virConnectRef() function, and as far as
> I can tell, it's busted.  Here's the simple example program I'm using:

Its not really virConnectRef - the entire connection ref-counting setup
is broken - a virDomainPtr takes a reference on a virConnectPtr too and
that's not working correctly either AFAICT.

> #include <stdio.h>
> #include <stdlib.h>
> #include <libvirt/libvirt.h>
> #include <unistd.h>
> 
> int main(int argc, char *argv[])
> {
>   virConnectPtr conn;
> 
>   conn = virConnectOpen(NULL);
>   printf("type is %s\n",virConnectGetType(conn));
>   virConnectRef(conn);
>   virConnectClose(conn);
>   virConnectClose(conn);
>   return 0;
> }
> 
> When compiling and running this program, I get a segfault during the *second*
> virConnectClose().  The crash comes in the remote_internal driver, because the
> first virConnectClose() actually freed up the remote_internal private memory,
> and now the second one comes along and accesses a NULL pointer.  I think this
> actually points to a bug in virConnectClose(); we shouldn't be running the
> ->close() callbacks on the drivers until we are going to be really closing up
> the driver, i.e. we should move all of the ->close() callbacks into
> virUnrefConnect().  Is that the right way to fix this?

We should just remove virUnrefConnect() completely. It is fundamentally 
wrong for that to be separate from virConnectClose(), since there are 
also places that call virUnrefConnect () directly which won't be releasing
the private data

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list