[Libvir] [PATCH] deep copy dom structure
Daniel Veillard
veillard at redhat.com
Mon Mar 31 12:49:12 UTC 2008
On Mon, Mar 31, 2008 at 08:12:19AM -0400, Daniel Veillard wrote:
> On Mon, Mar 31, 2008 at 01:02:49PM +0100, Daniel P. Berrange wrote:
> > We should at the very least NULL-ify the dom/net fields in the Error
> > object associated with the Connection when we free the Domain/Network
> > object.
>
> agreed, very simple test but avoids dandling pointers.
My patch for this. it's a bit more complex because we also keep a
global variable for the last variable, and that needed to be exported to
the hash module, it's still rather simple,
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard at redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
-------------- next part --------------
Index: src/hash.c
===================================================================
RCS file: /data/cvs/libxen/src/hash.c,v
retrieving revision 1.33
diff -p -r1.33 hash.c
*** src/hash.c 20 Feb 2008 15:06:53 -0000 1.33
--- src/hash.c 31 Mar 2008 12:46:28 -0000
*************** virReleaseConnect(virConnectPtr conn) {
*** 757,762 ****
--- 757,765 ----
virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName);
virResetError(&conn->err);
+ if (__lastErr.conn == conn)
+ __lastErr.conn = NULL;
+
free(conn->name);
pthread_mutex_unlock(&conn->lock);
*************** virReleaseDomain(virDomainPtr domain) {
*** 880,885 ****
--- 883,892 ----
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
_("domain missing from connection hash table"));
+ if (conn->err.dom == domain)
+ conn->err.dom = NULL;
+ if (__lastErr.dom == domain)
+ __lastErr.dom = NULL;
domain->magic = -1;
domain->id = -1;
free(domain->name);
*************** virReleaseNetwork(virNetworkPtr network)
*** 1013,1018 ****
--- 1020,1030 ----
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
_("network missing from connection hash table"));
+ if (conn->err.net == network)
+ conn->err.net = NULL;
+ if (__lastErr.net == network)
+ __lastErr.net = NULL;
+
network->magic = -1;
free(network->name);
free(network);
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libxen/src/internal.h,v
retrieving revision 1.64
diff -p -r1.64 internal.h
*** src/internal.h 27 Feb 2008 16:14:44 -0000 1.64
--- src/internal.h 31 Mar 2008 12:46:28 -0000
*************** struct _virStorageVol {
*** 264,269 ****
--- 264,270 ----
* API for error handling *
* *
************************************************************************/
+ extern virError __lastErr;
void __virRaiseError(virConnectPtr conn,
virDomainPtr dom,
virNetworkPtr net,
Index: src/virterror.c
===================================================================
RCS file: /data/cvs/libxen/src/virterror.c,v
retrieving revision 1.40
diff -p -r1.40 virterror.c
*** src/virterror.c 21 Mar 2008 15:03:37 -0000 1.40
--- src/virterror.c 31 Mar 2008 12:46:28 -0000
***************
*** 18,24 ****
#include "libvirt/virterror.h"
#include "internal.h"
! static virError lastErr = /* the last error */
{ 0, 0, NULL, VIR_ERR_NONE, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL };
static virErrorFunc virErrorHandler = NULL; /* global error handler */
static void *virUserData = NULL; /* associated data */
--- 18,24 ----
#include "libvirt/virterror.h"
#include "internal.h"
! virError __lastErr = /* the last error */
{ 0, 0, NULL, VIR_ERR_NONE, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL };
static virErrorFunc virErrorHandler = NULL; /* global error handler */
static void *virUserData = NULL; /* associated data */
*************** static void *virUserData = NULL;
*** 72,80 ****
virErrorPtr
virGetLastError(void)
{
! if (lastErr.code == VIR_ERR_OK)
return (NULL);
! return (&lastErr);
}
/*
--- 72,80 ----
virErrorPtr
virGetLastError(void)
{
! if (__lastErr.code == VIR_ERR_OK)
return (NULL);
! return (&__lastErr);
}
/*
*************** virCopyLastError(virErrorPtr to)
*** 92,101 ****
{
if (to == NULL)
return (-1);
! if (lastErr.code == VIR_ERR_OK)
return (0);
! memcpy(to, &lastErr, sizeof(virError));
! return (lastErr.code);
}
/**
--- 92,101 ----
{
if (to == NULL)
return (-1);
! if (__lastErr.code == VIR_ERR_OK)
return (0);
! memcpy(to, &__lastErr, sizeof(virError));
! return (__lastErr.code);
}
/**
*************** virResetError(virErrorPtr err)
*** 124,130 ****
void
virResetLastError(void)
{
! virResetError(&lastErr);
}
/**
--- 124,130 ----
void
virResetLastError(void)
{
! virResetError(&__lastErr);
}
/**
*************** __virRaiseError(virConnectPtr conn, virD
*** 347,353 ****
const char *str1, const char *str2, const char *str3,
int int1, int int2, const char *msg, ...)
{
! virErrorPtr to = &lastErr;
void *userData = virUserData;
virErrorFunc handler = virErrorHandler;
char *str;
--- 347,353 ----
const char *str1, const char *str2, const char *str3,
int int1, int int2, const char *msg, ...)
{
! virErrorPtr to = &__lastErr;
void *userData = virUserData;
virErrorFunc handler = virErrorHandler;
char *str;
More information about the libvir-list
mailing list