From 511f6cd6252f176bff72ba8f21b10bb3f9ae38af Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 17 Mar 2009 10:29:42 +0000 Subject: [PATCH] - Fix memory allocation for xend lookup - Avoid crash if storage volume deletion fails - Fix multiple FD leaks - Fix bug in dispatch FD events when a callback is marked deleted - Fix parsing of storage volume owner/group/mode - Fix memory allocation for virDomainGetVcpus RPC handler - Avoid deadlock in setting vCPU count - Use correct driver name in Xen block detach --- libvirt-0.6.1-events-dispatch.patch | 46 ++++++ libvirt-0.6.1-fd-leaks.patch | 78 ++++++++++ libvirt-0.6.1-fd-leaks2.patch | 40 +++++ libvirt-0.6.1-getvcpus-remote.patch | 22 +++ libvirt-0.6.1-pool-mode-parse.patch | 188 ++++++++++++++++++++++++ libvirt-0.6.1-storage-delete-fail.patch | 11 -- libvirt-0.6.1-storage-free.patch | 20 +++ libvirt-0.6.1-vcpu-deadlock.patch | 36 +++++ libvirt-0.6.1-xen-events.patch | 29 ++++ libvirt-0.6.1-xenblock-detach.patch | 26 ++++ libvirt-0.6.1-xend-lookup.patch | 24 +++ libvirt.spec | 37 ++++- 12 files changed, 542 insertions(+), 15 deletions(-) create mode 100644 libvirt-0.6.1-events-dispatch.patch create mode 100644 libvirt-0.6.1-fd-leaks.patch create mode 100644 libvirt-0.6.1-fd-leaks2.patch create mode 100644 libvirt-0.6.1-getvcpus-remote.patch create mode 100644 libvirt-0.6.1-pool-mode-parse.patch delete mode 100644 libvirt-0.6.1-storage-delete-fail.patch create mode 100644 libvirt-0.6.1-storage-free.patch create mode 100644 libvirt-0.6.1-vcpu-deadlock.patch create mode 100644 libvirt-0.6.1-xen-events.patch create mode 100644 libvirt-0.6.1-xenblock-detach.patch create mode 100644 libvirt-0.6.1-xend-lookup.patch diff --git a/libvirt-0.6.1-events-dispatch.patch b/libvirt-0.6.1-events-dispatch.patch new file mode 100644 index 0000000..49da108 --- /dev/null +++ b/libvirt-0.6.1-events-dispatch.patch @@ -0,0 +1,46 @@ +From: Daniel P. Berrange +Date: Mon, 16 Mar 2009 10:35:21 +0000 (+0000) +Subject: Fix dispatch of FD events when one or more handles are marked deleted +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=10baf3deb8588f5902b6f2eb362fb408707e3d95 + +Fix dispatch of FD events when one or more handles are marked deleted +--- + +diff --git a/qemud/event.c b/qemud/event.c +index c9ea563..0887008 100644 +--- a/qemud/event.c ++++ b/qemud/event.c +@@ -409,25 +409,26 @@ static int virEventDispatchTimeouts(void) { + * Returns 0 upon success, -1 if an error occurred + */ + static int virEventDispatchHandles(int nfds, struct pollfd *fds) { +- int i; ++ int i, n; + +- for (i = 0 ; i < nfds ; i++) { ++ for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) { + if (eventLoop.handles[i].deleted) { + EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd); + continue; + } + +- if (fds[i].revents) { ++ if (fds[n].revents) { + virEventHandleCallback cb = eventLoop.handles[i].cb; + void *opaque = eventLoop.handles[i].opaque; +- int hEvents = virPollEventToEventHandleType(fds[i].revents); +- EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd, +- fds[i].revents, eventLoop.handles[i].opaque); ++ int hEvents = virPollEventToEventHandleType(fds[n].revents); ++ EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd, ++ fds[n].revents, eventLoop.handles[i].opaque); + virEventUnlock(); + (cb)(eventLoop.handles[i].watch, +- fds[i].fd, hEvents, opaque); ++ fds[n].fd, hEvents, opaque); + virEventLock(); + } ++ n++; + } + + return 0; diff --git a/libvirt-0.6.1-fd-leaks.patch b/libvirt-0.6.1-fd-leaks.patch new file mode 100644 index 0000000..07d3c4c --- /dev/null +++ b/libvirt-0.6.1-fd-leaks.patch @@ -0,0 +1,78 @@ +From: Daniel Veillard +Date: Mon, 16 Mar 2009 10:41:37 +0000 (+0000) +Subject: Avoid some potential FILE * leaks +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=39429bab2d55807698d9aed0112200ae532799b8 + +Avoid some potential FILE * leaks +* qemud/qemud.c src/cgroup.c src/uml_driver.c src/util.c: close + some potential FILE * leaks +Daniel +--- + +diff --git a/qemud/qemud.c b/qemud/qemud.c +index fd315fc..4f04355 100644 +--- a/qemud/qemud.c ++++ b/qemud/qemud.c +@@ -488,7 +488,7 @@ static int qemudWritePidFile(const char *pidFile) { + if (fprintf(fh, "%lu\n", (unsigned long)getpid()) < 0) { + VIR_ERROR(_("Failed to write to pid file '%s' : %s"), + pidFile, virStrerror(errno, ebuf, sizeof ebuf)); +- close(fd); ++ fclose(fh); + return -1; + } + +diff --git a/src/cgroup.c b/src/cgroup.c +index 5af44bd..d1d44a2 100644 +--- a/src/cgroup.c ++++ b/src/cgroup.c +@@ -57,7 +57,7 @@ void virCgroupFree(virCgroupPtr *group) + + static virCgroupPtr virCgroupGetMount(const char *controller) + { +- FILE *mounts; ++ FILE *mounts = NULL; + struct mntent entry; + char buf[CGROUP_MAX_VAL]; + virCgroupPtr root = NULL; +@@ -90,6 +90,8 @@ static virCgroupPtr virCgroupGetMount(const char *controller) + + return root; + err: ++ if (mounts != NULL) ++ fclose(mounts); + virCgroupFree(&root); + + return NULL; +diff --git a/src/uml_driver.c b/src/uml_driver.c +index 1dc7ccd..f7400f9 100644 +--- a/src/uml_driver.c ++++ b/src/uml_driver.c +@@ -547,6 +547,7 @@ reopen: + + if (fscanf(file, "%d", &vm->pid) != 1) { + errno = EINVAL; ++ fclose(file); + goto cleanup; + } + +@@ -1040,6 +1041,7 @@ static int umlGetProcessInfo(unsigned long long *cpuTime, int pid) { + + if (fscanf(pidinfo, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %llu %llu", &usertime, &systime) != 2) { + umlDebug("not enough arg"); ++ fclose(pidinfo); + return -1; + } + +diff --git a/src/util.c b/src/util.c +index 9b74757..66ad9a4 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -1058,6 +1058,7 @@ int virFileReadPid(const char *dir, + + if (fscanf(file, "%d", pid) != 1) { + rc = EINVAL; ++ fclose(file); + goto cleanup; + } + diff --git a/libvirt-0.6.1-fd-leaks2.patch b/libvirt-0.6.1-fd-leaks2.patch new file mode 100644 index 0000000..e2914aa --- /dev/null +++ b/libvirt-0.6.1-fd-leaks2.patch @@ -0,0 +1,40 @@ +Index: src/remote_internal.c +=================================================================== +RCS file: /data/cvs/libxen/src/remote_internal.c,v +retrieving revision 1.141 +diff -u -u -p -r1.141 remote_internal.c +--- src/remote_internal.c 3 Mar 2009 19:33:34 -0000 1.141 ++++ src/remote_internal.c 16 Mar 2009 16:57:17 -0000 +@@ -332,7 +332,7 @@ doRemoteOpen (virConnectPtr conn, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + int flags) + { +- int wakeupFD[2]; ++ int wakeupFD[2] = { -1, -1 }; + char *transport_str = NULL; + + if (conn->uri) { +@@ -885,6 +885,11 @@ doRemoteOpen (virConnectPtr conn, + #endif + } + ++ if (wakeupFD[0] >= 0) { ++ close(wakeupFD[0]); ++ close(wakeupFD[1]); ++ } ++ + VIR_FREE(priv->hostname); + goto cleanup; + } +@@ -1350,6 +1355,11 @@ doRemoteClose (virConnectPtr conn, struc + } while (reap != -1 && reap != priv->pid); + } + #endif ++ if (priv->wakeupReadFD >= 0) { ++ close(priv->wakeupReadFD); ++ close(priv->wakeupSendFD); ++ } ++ + + /* Free hostname copy */ + free (priv->hostname); diff --git a/libvirt-0.6.1-getvcpus-remote.patch b/libvirt-0.6.1-getvcpus-remote.patch new file mode 100644 index 0000000..9b38d24 --- /dev/null +++ b/libvirt-0.6.1-getvcpus-remote.patch @@ -0,0 +1,22 @@ +From: Daniel P. Berrange +Date: Mon, 16 Mar 2009 10:33:01 +0000 (+0000) +Subject: Fix handling of cpumaps arg to virDomainGetVcpus RPC dispatcher +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=2d75d954f52a740470f85ceece4eb995d79968ca + +Fix handling of cpumaps arg to virDomainGetVcpus RPC dispatcher +--- + +diff --git a/qemud/remote.c b/qemud/remote.c +index 8eaa7d6..44a274a 100644 +--- a/qemud/remote.c ++++ b/qemud/remote.c +@@ -1475,7 +1475,8 @@ remoteDispatchDomainGetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED, + /* Allocate buffers to take the results. */ + if (VIR_ALLOC_N(info, args->maxinfo) < 0) + goto oom; +- if (VIR_ALLOC_N(cpumaps, args->maxinfo) < 0) ++ if (args->maplen > 0 && ++ VIR_ALLOC_N(cpumaps, args->maxinfo * args->maplen) < 0) + goto oom; + + info_len = virDomainGetVcpus (dom, diff --git a/libvirt-0.6.1-pool-mode-parse.patch b/libvirt-0.6.1-pool-mode-parse.patch new file mode 100644 index 0000000..4c400b6 --- /dev/null +++ b/libvirt-0.6.1-pool-mode-parse.patch @@ -0,0 +1,188 @@ +From: Daniel Veillard +Date: Thu, 12 Mar 2009 20:15:32 +0000 (+0000) +Subject: * src/storage_conf.c: fix storage pool mode parsing, and refactoring +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=bc962f5d7c6e2c2cfc233ea6deea95dba2b7c6eb + +* src/storage_conf.c: fix storage pool mode parsing, and refactoring + patch by Ryota Ozaki +Daniel +--- + +diff --git a/src/storage_conf.c b/src/storage_conf.c +index 9c13e07..1c9a4e5 100644 +--- a/src/storage_conf.c ++++ b/src/storage_conf.c +@@ -371,15 +371,33 @@ virStoragePoolDefParseAuthChap(virConnectPtr conn, + + + static int +-virStoragePoolDefParsePerms(virConnectPtr conn, +- xmlXPathContextPtr ctxt, +- virStoragePermsPtr perms) { ++virStorageDefParsePerms(virConnectPtr conn, ++ xmlXPathContextPtr ctxt, ++ virStoragePermsPtr perms, ++ const char *permxpath, ++ int defaultmode) { + char *mode; + long v; ++ int ret = -1; ++ xmlNodePtr relnode; ++ xmlNodePtr node; + +- mode = virXPathString(conn, "string(/pool/permissions/mode)", ctxt); ++ node = virXPathNode(conn, permxpath, ctxt); ++ if (node == NULL) { ++ /* Set default values if there is not element */ ++ perms->mode = defaultmode; ++ perms->uid = getuid(); ++ perms->gid = getgid(); ++ perms->label = NULL; ++ return 0; ++ } ++ ++ relnode = ctxt->node; ++ ctxt->node = node; ++ ++ mode = virXPathString(conn, "string(./mode)", ctxt); + if (!mode) { +- perms->mode = 0700; ++ perms->mode = defaultmode; + } else { + char *end = NULL; + perms->mode = strtol(mode, &end, 8); +@@ -387,36 +405,39 @@ virStoragePoolDefParsePerms(virConnectPtr conn, + if (*end || perms->mode < 0 || perms->mode > 0777) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + "%s", _("malformed octal mode")); +- return -1; ++ goto error; + } + } + +- if (virXPathNode(conn, "/pool/permissions/owner", ctxt) == NULL) { ++ if (virXPathNode(conn, "./owner", ctxt) == NULL) { + perms->uid = getuid(); + } else { +- if (virXPathLong(conn, "number(/pool/permissions/owner)", ctxt, &v) < 0) { ++ if (virXPathLong(conn, "number(./owner)", ctxt, &v) < 0) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + "%s", _("malformed owner element")); +- return -1; ++ goto error; + } + perms->uid = (int)v; + } + +- if (virXPathNode(conn, "/pool/permissions/group", ctxt) == NULL) { ++ if (virXPathNode(conn, "./group", ctxt) == NULL) { + perms->gid = getgid(); + } else { +- if (virXPathLong(conn, "number(/pool/permissions/group)", ctxt, &v) < 0) { ++ if (virXPathLong(conn, "number(./group)", ctxt, &v) < 0) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + "%s", _("malformed group element")); +- return -1; ++ goto error; + } + perms->gid = (int)v; + } + + /* NB, we're ignoring missing labels here - they'll simply inherit */ +- perms->label = virXPathString(conn, "string(/pool/permissions/label)", ctxt); ++ perms->label = virXPathString(conn, "string(./label)", ctxt); + +- return 0; ++ ret = 0; ++error: ++ ctxt->node = relnode; ++ return ret; + } + + +@@ -579,7 +600,8 @@ virStoragePoolDefParseDoc(virConnectPtr conn, + goto cleanup; + } + +- if (virStoragePoolDefParsePerms(conn, ctxt, &ret->target.perms) < 0) ++ if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms, ++ "/pool/target/permissions", 0700) < 0) + goto cleanup; + + return ret; +@@ -801,55 +823,6 @@ virStoragePoolDefFormat(virConnectPtr conn, + + + static int +-virStorageVolDefParsePerms(virConnectPtr conn, +- xmlXPathContextPtr ctxt, +- virStoragePermsPtr perms) { +- char *mode; +- long v; +- +- mode = virXPathString(conn, "string(/volume/permissions/mode)", ctxt); +- if (!mode) { +- perms->mode = 0600; +- } else { +- char *end = NULL; +- perms->mode = strtol(mode, &end, 8); +- VIR_FREE(mode); +- if (*end || perms->mode < 0 || perms->mode > 0777) { +- virStorageReportError(conn, VIR_ERR_XML_ERROR, +- "%s", _("malformed octal mode")); +- return -1; +- } +- } +- +- if (virXPathNode(conn, "/volume/permissions/owner", ctxt) == NULL) { +- perms->uid = getuid(); +- } else { +- if (virXPathLong(conn, "number(/volume/permissions/owner)", ctxt, &v) < 0) { +- virStorageReportError(conn, VIR_ERR_XML_ERROR, +- "%s", _("missing owner element")); +- return -1; +- } +- perms->uid = (int)v; +- } +- if (virXPathNode(conn, "/volume/permissions/group", ctxt) == NULL) { +- perms->gid = getgid(); +- } else { +- if (virXPathLong(conn, "number(/volume/permissions/group)", ctxt, &v) < 0) { +- virStorageReportError(conn, VIR_ERR_XML_ERROR, +- "%s", _("missing group element")); +- return -1; +- } +- perms->gid = (int)v; +- } +- +- /* NB, we're ignoring missing labels here - they'll simply inherit */ +- perms->label = virXPathString(conn, "string(/volume/permissions/label)", ctxt); +- +- return 0; +-} +- +- +-static int + virStorageSize(virConnectPtr conn, + const char *unit, + const char *val, +@@ -997,7 +970,8 @@ virStorageVolDefParseDoc(virConnectPtr conn, + VIR_FREE(format); + } + +- if (virStorageVolDefParsePerms(conn, ctxt, &ret->target.perms) < 0) ++ if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms, ++ "/volume/target/permissions", 0600) < 0) + goto cleanup; + + +@@ -1019,7 +993,8 @@ virStorageVolDefParseDoc(virConnectPtr conn, + VIR_FREE(format); + } + +- if (virStorageVolDefParsePerms(conn, ctxt, &ret->backingStore.perms) < 0) ++ if (virStorageDefParsePerms(conn, ctxt, &ret->backingStore.perms, ++ "/volume/backingStore/permissions", 0600) < 0) + goto cleanup; + + return ret; diff --git a/libvirt-0.6.1-storage-delete-fail.patch b/libvirt-0.6.1-storage-delete-fail.patch deleted file mode 100644 index 9880012..0000000 --- a/libvirt-0.6.1-storage-delete-fail.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -rup libvirt-0.6.1.orig/src/storage_driver.c libvirt-0.6.1.new/src/storage_driver.c ---- libvirt-0.6.1.orig/src/storage_driver.c 2009-02-16 03:43:41.000000000 -0500 -+++ libvirt-0.6.1.new/src/storage_driver.c 2009-03-06 08:02:51.000000000 -0500 -@@ -1296,7 +1296,6 @@ storageVolumeDelete(virStorageVolPtr obj - ret = 0; - - cleanup: -- virStorageVolDefFree(vol); - if (pool) - virStoragePoolObjUnlock(pool); - return ret; diff --git a/libvirt-0.6.1-storage-free.patch b/libvirt-0.6.1-storage-free.patch new file mode 100644 index 0000000..bfda133 --- /dev/null +++ b/libvirt-0.6.1-storage-free.patch @@ -0,0 +1,20 @@ +From: Daniel P. Berrange +Date: Mon, 16 Mar 2009 10:31:38 +0000 (+0000) +Subject: Don't free storage volume in cleanup path, since it may still be referenced +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=d8f08ca049b6d3bc7a5124a3957e967539ad080d + +Don't free storage volume in cleanup path, since it may still be referenced +--- + +diff --git a/src/storage_driver.c b/src/storage_driver.c +index f1320c5..b261843 100644 +--- a/src/storage_driver.c ++++ b/src/storage_driver.c +@@ -1296,7 +1296,6 @@ storageVolumeDelete(virStorageVolPtr obj, + ret = 0; + + cleanup: +- virStorageVolDefFree(vol); + if (pool) + virStoragePoolObjUnlock(pool); + return ret; diff --git a/libvirt-0.6.1-vcpu-deadlock.patch b/libvirt-0.6.1-vcpu-deadlock.patch new file mode 100644 index 0000000..f9df448 --- /dev/null +++ b/libvirt-0.6.1-vcpu-deadlock.patch @@ -0,0 +1,36 @@ +From: Daniel P. Berrange +Date: Mon, 16 Mar 2009 11:44:46 +0000 (+0000) +Subject: Avoid deadlock setting vcpus in QEMU driver +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=4d7ecd146ce4de847256ae0887963719f214f62f + +Avoid deadlock setting vcpus in QEMU driver +--- + +diff --git a/src/qemu_driver.c b/src/qemu_driver.c +index dad7098..51442d6 100644 +--- a/src/qemu_driver.c ++++ b/src/qemu_driver.c +@@ -2725,6 +2725,7 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) { + virDomainObjPtr vm; + int max; + int ret = -1; ++ const char *type; + + qemuDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); +@@ -2745,7 +2746,14 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) { + goto cleanup; + } + +- if ((max = qemudDomainGetMaxVcpus(dom)) < 0) { ++ if (!(type = virDomainVirtTypeToString(vm->def->virtType))) { ++ qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR, ++ _("unknown virt type in domain definition '%d'"), ++ vm->def->virtType); ++ goto cleanup; ++ } ++ ++ if ((max = qemudGetMaxVCPUs(dom->conn, type)) < 0) { + qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR, "%s", + _("could not determine max vcpus for the domain")); + goto cleanup; diff --git a/libvirt-0.6.1-xen-events.patch b/libvirt-0.6.1-xen-events.patch new file mode 100644 index 0000000..dd80746 --- /dev/null +++ b/libvirt-0.6.1-xen-events.patch @@ -0,0 +1,29 @@ +Index: src/xs_internal.c +=================================================================== +RCS file: /data/cvs/libxen/src/xs_internal.c,v +retrieving revision 1.88 +diff -u -u -r1.88 xs_internal.c +--- src/xs_internal.c 5 Feb 2009 18:14:00 -0000 1.88 ++++ src/xs_internal.c 11 Mar 2009 13:23:17 -0000 +@@ -1215,7 +1215,7 @@ + static void + xenStoreWatchEvent(int watch ATTRIBUTE_UNUSED, + int fd ATTRIBUTE_UNUSED, +- int events ATTRIBUTE_UNUSED, ++ int events, + void *data) + { + char **event; +@@ -1226,8 +1226,12 @@ + + virConnectPtr conn = data; + xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData; ++ + if(!priv) return; + ++ /* only set a watch on read and write events */ ++ if (events & (VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP)) return; ++ + xenUnifiedLock(priv); + + if(!priv->xshandle) diff --git a/libvirt-0.6.1-xenblock-detach.patch b/libvirt-0.6.1-xenblock-detach.patch new file mode 100644 index 0000000..204f5d9 --- /dev/null +++ b/libvirt-0.6.1-xenblock-detach.patch @@ -0,0 +1,26 @@ +From: Daniel P. Berrange +Date: Tue, 10 Mar 2009 10:32:24 +0000 (+0000) +Subject: Fix Xen block detach with newer Xend (Cole RobinSon / Tomohiro Takahashi) +X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=33813a932d58c17441203d0e581eba91369a71e0 + +Fix Xen block detach with newer Xend (Cole RobinSon / Tomohiro Takahashi) +--- + +diff --git a/src/xend_internal.c b/src/xend_internal.c +index f9f2cb3..772f3f4 100644 +--- a/src/xend_internal.c ++++ b/src/xend_internal.c +@@ -5566,7 +5566,12 @@ virDomainXMLDevID(virDomainPtr domain, + char *xref; + + if (dev->type == VIR_DOMAIN_DEVICE_DISK) { +- strcpy(class, "vbd"); ++ if (dev->data.disk->driverName && ++ STREQ(dev->data.disk->driverName, "tap")) ++ strcpy(class, "tap"); ++ else ++ strcpy(class, "vbd"); ++ + if (dev->data.disk->dst == NULL) + return -1; + xenUnifiedLock(priv); diff --git a/libvirt-0.6.1-xend-lookup.patch b/libvirt-0.6.1-xend-lookup.patch new file mode 100644 index 0000000..ea9a175 --- /dev/null +++ b/libvirt-0.6.1-xend-lookup.patch @@ -0,0 +1,24 @@ +Index: src/xend_internal.c +=================================================================== +RCS file: /data/cvs/libxen/src/xend_internal.c,v +retrieving revision 1.251 +diff -u -r1.251 xend_internal.c +--- src/xend_internal.c 13 Feb 2009 18:23:23 -0000 1.251 ++++ src/xend_internal.c 10 Mar 2009 10:00:28 -0000 +@@ -904,7 +904,15 @@ + count++; + } + +- if (VIR_ALLOC_N(ptr, count + 1 + extra) < 0) ++ /* ++ * We can'tuse the normal allocation routines as we are mixing ++ * an array of char * at the beginning followed by an array of char ++ * ret points to the NULL terminated array of char * ++ * ptr points to the current string after that array but in the same ++ * allocated block ++ */ ++ if (virAlloc((void *)&ptr, ++ (count + 1) * sizeof(char *) + extra * sizeof(char)) < 0) + goto error; + + ret = (char **) ptr; diff --git a/libvirt.spec b/libvirt.spec index 13585ab..f672800 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -47,14 +47,24 @@ Summary: Library providing a simple API virtualization Name: libvirt Version: 0.6.1 -Release: 3%{?dist}%{?extra_release} +Release: 4%{?dist}%{?extra_release} License: LGPLv2+ Group: Development/Libraries Source: libvirt-%{version}.tar.gz -Patch1: libvirt-%{version}-storage-delete-fail.patch +Patch1: libvirt-0.6.1-xend-lookup.patch +Patch2: libvirt-0.6.1-xen-events.patch +Patch3: libvirt-0.6.1-events-dispatch.patch +Patch4: libvirt-0.6.1-fd-leaks.patch +Patch5: libvirt-0.6.1-getvcpus-remote.patch +Patch6: libvirt-0.6.1-pool-mode-parse.patch +Patch7: libvirt-0.6.1-storage-free.patch +Patch8: libvirt-0.6.1-vcpu-deadlock.patch +Patch9: libvirt-0.6.1-xenblock-detach.patch +Patch10: libvirt-0.6.1-fd-leaks2.patch # Not upstream yet - pending QEMU merge -Patch100: libvirt-%{version}-vnc-sasl-auth.patch +Patch100: libvirt-0.6.1-vnc-sasl-auth.patch + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root URL: http://libvirt.org/ BuildRequires: python python-devel @@ -185,7 +195,16 @@ of recent versions of Linux (and other OSes). %prep %setup -q -%patch1 -p1 +%patch1 -p0 +%patch2 -p0 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p0 %patch100 -p1 @@ -480,6 +499,16 @@ fi %endif %changelog +* Tue Mar 17 2009 Daniel P. Berrange - 0.6.1-4.fc11 +- Fix memory allocation for xend lookup +- Avoid crash if storage volume deletion fails +- Fix multiple FD leaks +- Fix bug in dispatch FD events when a callback is marked deleted +- Fix parsing of storage volume owner/group/mode +- Fix memory allocation for virDomainGetVcpus RPC handler +- Avoid deadlock in setting vCPU count +- Use correct driver name in Xen block detach + * Mon Mar 9 2009 Cole Robinson - 0.6.1-3.fc11 - Add Requires: libselinux