Blame SOURCES/0004-Clear-typed-parameter-elements-as-well-as-array.patch

f6cd17
From 88cf0236e1b98b00bcaa5762f9207b99fb98e084 Mon Sep 17 00:00:00 2001
f6cd17
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
f6cd17
Date: Mon, 6 Aug 2018 17:11:57 +0100
f6cd17
Subject: [PATCH] Clear typed parameter elements as well as array
f6cd17
MIME-Version: 1.0
f6cd17
Content-Type: text/plain; charset=UTF-8
f6cd17
Content-Transfer-Encoding: 8bit
f6cd17
f6cd17
Some typed parameter elements may contain strings that need to be
f6cd17
freed.
f6cd17
f6cd17
We must ensure that the parameter array has dup'd the strings
f6cd17
rather than borrowing a pointer.
f6cd17
f6cd17
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
f6cd17
(cherry picked from commit 54f0d2c64021e6e143f40185f0181cf5d5a51f53)
f6cd17
---
f6cd17
 lib/Sys/Virt.xs | 124 ++++++++++++++++++++++++++----------------------
f6cd17
 1 file changed, 66 insertions(+), 58 deletions(-)
f6cd17
f6cd17
diff --git a/lib/Sys/Virt.xs b/lib/Sys/Virt.xs
f6cd17
index 3d8eb9b..6c2bf48 100644
f6cd17
--- a/lib/Sys/Virt.xs
f6cd17
+++ b/lib/Sys/Virt.xs
f6cd17
@@ -86,7 +86,6 @@ virt_newSVull(unsigned long long val) {
f6cd17
 }
f6cd17
 
f6cd17
 
f6cd17
-
f6cd17
 static void
f6cd17
 ignoreVirErrorFunc(void * userData, virErrorPtr error) {
f6cd17
   /* Do nothing */
f6cd17
@@ -263,7 +262,8 @@ vir_typed_param_from_hv(HV *newparams, virTypedParameterPtr params, int nparams)
f6cd17
 
f6cd17
         case VIR_TYPED_PARAM_STRING:
f6cd17
             ptr = SvPV(*val, len);
f6cd17
-            params[i].value.s = (char *)ptr;
f6cd17
+            if (!(params[i].value.s = strdup((char *)ptr)))
f6cd17
+                abort();
f6cd17
             break;
f6cd17
         }
f6cd17
     }
f6cd17
@@ -300,7 +300,8 @@ vir_typed_param_add_string_list_from_hv(HV *newparams,
f6cd17
       localparams[*nparams + i].field[VIR_TYPED_PARAM_FIELD_LENGTH - 1] = '\0';
f6cd17
 
f6cd17
       localparams[*nparams + i].type = VIR_TYPED_PARAM_STRING;
f6cd17
-      localparams[*nparams + i].value.s = ptr;
f6cd17
+      if (!(localparams[*nparams + i].value.s = strdup(ptr)))
f6cd17
+	  abort();
f6cd17
     }
f6cd17
 
f6cd17
     *params = localparams;
f6cd17
@@ -308,6 +309,14 @@ vir_typed_param_add_string_list_from_hv(HV *newparams,
f6cd17
 }
f6cd17
 
f6cd17
 
f6cd17
+static void
f6cd17
+vir_typed_param_safe_free(virTypedParameterPtr params, int nparams)
f6cd17
+{
f6cd17
+    virTypedParamsClear(params, nparams);
f6cd17
+    Safefree(params);
f6cd17
+}
f6cd17
+
f6cd17
+
f6cd17
 static int
f6cd17
 _domain_event_lifecycle_callback(virConnectPtr con,
f6cd17
                                  virDomainPtr dom,
f6cd17
@@ -2411,7 +2420,7 @@ get_node_sev_info(conn, flags=0)
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      free(params);
f6cd17
+      virTypedParamsFree(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -2651,12 +2660,12 @@ get_node_memory_parameters(conn, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virNodeGetMemoryParameters(conn, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -2677,17 +2686,17 @@ set_node_memory_parameters(conn, newparams, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virNodeGetMemoryParameters(conn, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
 
f6cd17
       if (virNodeSetMemoryParameters(conn, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 
f6cd17
@@ -4562,13 +4571,12 @@ get_job_stats(dom, flags=0)
f6cd17
       SV *typeSv;
f6cd17
     PPCODE:
f6cd17
       if (virDomainGetJobStats(dom, &type, &params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       typeSv = newSViv(type);
f6cd17
       paramsHv = vir_typed_param_to_hv(params, nparams);
f6cd17
-      free(params);
f6cd17
+      virTypedParamsFree(params, nparams);
f6cd17
 
f6cd17
       EXTEND(SP, 2);
f6cd17
       PUSHs(newRV_noinc((SV*)typeSv));
f6cd17
@@ -4676,11 +4684,11 @@ block_copy(dom, path, destxml, newparams, flags=0)
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
 
f6cd17
       if (virDomainBlockCopy(dom, path, destxml, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 void
f6cd17
@@ -4741,17 +4749,17 @@ get_scheduler_parameters(dom, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
       if (flags) {
f6cd17
           if (virDomainGetSchedulerParametersFlags(dom, params, &nparams, flags) < 0) {
f6cd17
-              Safefree(params);
f6cd17
+              vir_typed_param_safe_free(params, nparams);
f6cd17
               _croak_error();
f6cd17
           }
f6cd17
       } else {
f6cd17
           if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0) {
f6cd17
-              Safefree(params);
f6cd17
+              vir_typed_param_safe_free(params, nparams);
f6cd17
               _croak_error();
f6cd17
           }
f6cd17
       }
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -4772,22 +4780,22 @@ set_scheduler_parameters(dom, newparams, flags=0)
f6cd17
       free(type);
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
       if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
       if (flags) {
f6cd17
           if (virDomainSetSchedulerParametersFlags(dom, params, nparams, flags) < 0) {
f6cd17
-              Safefree(params);
f6cd17
+              vir_typed_param_safe_free(params, nparams);
f6cd17
               _croak_error();
f6cd17
           }
f6cd17
       } else {
f6cd17
           if (virDomainSetSchedulerParameters(dom, params, nparams) < 0) {
f6cd17
-              Safefree(params);
f6cd17
+              vir_typed_param_safe_free(params, nparams);
f6cd17
               _croak_error();
f6cd17
           }
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -4805,12 +4813,12 @@ get_memory_parameters(dom, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetMemoryParameters(dom, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -4831,17 +4839,17 @@ set_memory_parameters(dom, newparams, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetMemoryParameters(dom, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
 
f6cd17
       if (virDomainSetMemoryParameters(dom, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -4859,12 +4867,12 @@ get_numa_parameters(dom, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetNumaParameters(dom, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -4885,17 +4893,17 @@ set_numa_parameters(dom, newparams, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetNumaParameters(dom, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
 
f6cd17
       if (virDomainSetNumaParameters(dom, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -4913,12 +4921,12 @@ get_blkio_parameters(dom, flags=0)
f6cd17
       Newx(params, nparams, virBlkioParameter);
f6cd17
 
f6cd17
       if (virDomainGetBlkioParameters(dom, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -4939,7 +4947,7 @@ set_blkio_parameters(dom, newparams, flags=0)
f6cd17
       Newx(params, nparams, virBlkioParameter);
f6cd17
 
f6cd17
       if (virDomainGetBlkioParameters(dom, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
@@ -4947,10 +4955,10 @@ set_blkio_parameters(dom, newparams, flags=0)
f6cd17
 
f6cd17
       if (virDomainSetBlkioParameters(dom, params, nparams,
f6cd17
                                       flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -4962,12 +4970,12 @@ get_perf_events(dom, flags=0)
f6cd17
       int nparams = 0;
f6cd17
     CODE:
f6cd17
       if (virDomainGetPerfEvents(dom, &params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -4982,7 +4990,7 @@ set_perf_events(dom, newparams, flags=0)
f6cd17
       int nparams = 0;
f6cd17
     PPCODE:
f6cd17
       if (virDomainGetPerfEvents(dom, &params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
@@ -4990,7 +4998,7 @@ set_perf_events(dom, newparams, flags=0)
f6cd17
 
f6cd17
       if (virDomainSetPerfEvents(dom, params, nparams, flags) < 0)
f6cd17
           _croak_error();
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -5005,7 +5013,7 @@ get_launch_security_info(dom, flags=0)
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      free(params);
f6cd17
+      virTypedParamsFree(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -5386,10 +5394,10 @@ _migrate(dom, destcon, newparams, flags=0)
f6cd17
       * if it is possible todo so
f6cd17
       */
f6cd17
      if ((RETVAL = virDomainMigrate3(dom, destcon, params, nparams, flags)) == NULL) {
f6cd17
-         Safefree(params);
f6cd17
+         vir_typed_param_safe_free(params, nparams);
f6cd17
          _croak_error();
f6cd17
      }
f6cd17
-     Safefree(params);
f6cd17
+     vir_typed_param_safe_free(params, nparams);
f6cd17
  OUTPUT:
f6cd17
      RETVAL
f6cd17
 
f6cd17
@@ -5477,10 +5485,10 @@ _migrate_to_uri(dom, desturi, newparams, flags=0)
f6cd17
       * if it is possible todo so
f6cd17
       */
f6cd17
      if (virDomainMigrateToURI3(dom, desturi, params, nparams, flags) < 0) {
f6cd17
-         Safefree(params);
f6cd17
+         vir_typed_param_safe_free(params, nparams);
f6cd17
          _croak_error();
f6cd17
      }
f6cd17
-     Safefree(params);
f6cd17
+     vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 void
f6cd17
@@ -5639,12 +5647,12 @@ get_block_iotune(dom, disk, flags=0)
f6cd17
 
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
       if (virDomainGetBlockIoTune(dom, disk, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -5665,16 +5673,16 @@ set_block_iotune(dom, disk, newparams, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetBlockIoTune(dom, disk, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
       if (virDomainSetBlockIoTune(dom, disk, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -5693,12 +5701,12 @@ get_interface_parameters(dom, intf, flags=0)
f6cd17
 
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
       if (virDomainGetInterfaceParameters(dom, intf, params, &nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       RETVAL = vir_typed_param_to_hv(params, nparams);
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
 
f6cd17
@@ -5719,16 +5727,16 @@ set_interface_parameters(dom, intf, newparams, flags=0)
f6cd17
       Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
       if (virDomainGetInterfaceParameters(dom, intf, params, &nparams, 0) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
       nparams = vir_typed_param_from_hv(newparams, params, nparams);
f6cd17
       if (virDomainSetInterfaceParameters(dom, intf, params, nparams, flags) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 HV *
f6cd17
@@ -5764,7 +5772,7 @@ block_stats(dom, path, flags=0)
f6cd17
           Newx(params, nparams, virTypedParameter);
f6cd17
 
f6cd17
           if (virDomainBlockStatsFlags(dom, path, params, &nparams, flags) < 0) {
f6cd17
-              Safefree(params);
f6cd17
+              vir_typed_param_safe_free(params, nparams);
f6cd17
               _croak_error();
f6cd17
           }
f6cd17
 
f6cd17
@@ -5784,7 +5792,7 @@ block_stats(dom, path, flags=0)
f6cd17
                   (void)hv_store(RETVAL, field, strlen(field), val, 0);
f6cd17
               }
f6cd17
           }
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
       }
f6cd17
   OUTPUT:
f6cd17
       RETVAL
f6cd17
@@ -6018,7 +6026,7 @@ get_cpu_stats(dom, start_cpu, ncpus, flags=0)
f6cd17
 
f6cd17
       Newx(params, ncpus * nparams, virTypedParameter);
f6cd17
       if ((ret = virDomainGetCPUStats(dom, params, nparams, start_cpu, ncpus, flags)) < 0) {
f6cd17
-          Safefree(params);
f6cd17
+          vir_typed_param_safe_free(params, nparams);
f6cd17
           _croak_error();
f6cd17
       }
f6cd17
 
f6cd17
@@ -6028,7 +6036,7 @@ get_cpu_stats(dom, start_cpu, ncpus, flags=0)
f6cd17
           PUSHs(newRV_noinc((SV *)rec));
f6cd17
       }
f6cd17
 
f6cd17
-      Safefree(params);
f6cd17
+      vir_typed_param_safe_free(params, nparams);
f6cd17
 
f6cd17
 
f6cd17
 void