]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
vcpupin: Fix returning of arrays from virDomainVcpuPinAdd
authorPeter Krempa <pkrempa@redhat.com>
Thu, 30 Aug 2012 13:38:37 +0000 (15:38 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 30 Aug 2012 14:45:38 +0000 (16:45 +0200)
virDomainVcpuPinAdd does a realloc on vcpupin_list if the new vcpu pin
definition doesn't fit into the array. The list is an array of pointers
but the function definition didn't support returning the changed pointer
to the caller if it was realloced. This caused segfaults if realloc
would change the base pointer.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libxl/libxl_driver.c
src/qemu/qemu_driver.c
src/xen/xend_internal.c

index 2dad64dca06792096987c02c3fbd7e01f2b52ebb..554298d172e6325181bb90388d1ed8331845ce79 100644 (file)
@@ -11037,7 +11037,7 @@ cleanup:
     return bitmap;
 }
 
-int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
+int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
                         int *nvcpupin,
                         unsigned char *cpumap,
                         int maplen,
@@ -11052,7 +11052,7 @@ int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
     if ((cpumask = bitmapFromBytemap(cpumap, maplen)) == NULL)
         return -1;
 
-    vcpupin = virDomainVcpuPinFindByVcpu(vcpupin_list,
+    vcpupin = virDomainVcpuPinFindByVcpu(*vcpupin_list,
                                          *nvcpupin,
                                          vcpu);
     if (vcpupin) {
@@ -11073,14 +11073,14 @@ int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
     vcpupin->cpumask = cpumask;
 
 
-    if (VIR_REALLOC_N(vcpupin_list, *nvcpupin + 1) < 0) {
+    if (VIR_REALLOC_N(*vcpupin_list, *nvcpupin + 1) < 0) {
         virReportOOMError();
         VIR_FREE(cpumask);
         VIR_FREE(vcpupin);
         return -1;
     }
 
-    vcpupin_list[(*nvcpupin)++] = vcpupin;
+    (*vcpupin_list)[(*nvcpupin)++] = vcpupin;
 
     return 0;
 }
index 9ee57e1cb6b27030d6d007e33c00272c20fd01f9..dfdae4940c17d4491bc2e450e7f61fa6e4ae8659 100644 (file)
@@ -1885,7 +1885,7 @@ int virDomainCpuSetParse(const char *str,
 char *virDomainCpuSetFormat(char *cpuset,
                             int maxcpu);
 
-int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
+int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
                         int *nvcpupin,
                         unsigned char *cpumap,
                         int maplen,
index d8ecf1330487d5f65e407f59d40dc2614aef7c78..1638314c03fe22c1770b9e1797727b93c73e237b 100644 (file)
@@ -2461,7 +2461,7 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap,
         }
         vm->def->cputune.nvcpupin = 0;
     }
-    if (virDomainVcpuPinAdd(vm->def->cputune.vcpupin,
+    if (virDomainVcpuPinAdd(&vm->def->cputune.vcpupin,
                             &vm->def->cputune.nvcpupin,
                             cpumap,
                             maplen,
index 7c0a5c3a66c4cd9aa8ce90c359fdea64bad26710..5670ca07820208c5f9b4cb07c4a447191ab2d0a6 100644 (file)
@@ -3782,7 +3782,7 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
             newVcpuPinNum = 0;
         }
 
-        if (virDomainVcpuPinAdd(newVcpuPin, &newVcpuPinNum, cpumap, maplen, vcpu) < 0) {
+        if (virDomainVcpuPinAdd(&newVcpuPin, &newVcpuPinNum, cpumap, maplen, vcpu) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("failed to update vcpupin"));
             virDomainVcpuPinDefFree(newVcpuPin, newVcpuPinNum);
@@ -3849,7 +3849,7 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
                 }
                 persistentDef->cputune.nvcpupin = 0;
             }
-            if (virDomainVcpuPinAdd(persistentDef->cputune.vcpupin,
+            if (virDomainVcpuPinAdd(&persistentDef->cputune.vcpupin,
                                     &persistentDef->cputune.nvcpupin,
                                     cpumap,
                                     maplen,
@@ -4042,7 +4042,7 @@ qemudDomainPinEmulator(virDomainPtr dom,
                 newVcpuPinNum = 0;
             }
 
-            if (virDomainVcpuPinAdd(newVcpuPin, &newVcpuPinNum, cpumap, maplen, -1) < 0) {
+            if (virDomainVcpuPinAdd(&newVcpuPin, &newVcpuPinNum, cpumap, maplen, -1) < 0) {
                 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                                _("failed to update vcpupin"));
                 virDomainVcpuPinDefFree(newVcpuPin, newVcpuPinNum);
index 99def429a37dcbaea8b258f16034d367952cf3f0..984f0404a8586b12afb220ad2ce752e4824d7aa2 100644 (file)
@@ -2303,7 +2303,7 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
             }
             def->cputune.nvcpupin = 0;
         }
-        if (virDomainVcpuPinAdd(def->cputune.vcpupin,
+        if (virDomainVcpuPinAdd(&def->cputune.vcpupin,
                                 &def->cputune.nvcpupin,
                                 cpumap,
                                 maplen,