When working with typed params calling pure free() over an array
of params is not enough. Some items in the array may be type of
string in which case they have a pointer to an allocated memory
too. Therefore we should use virTypedParamsFree() which does all
the necessary.
Moreover, some methods (set_interface_parameters() and
set_block_iotune()) were missing any free at all.
==16768== 1 bytes in 1 blocks are definitely lost in loss record 2 of 7,378
==16768== at 0x4C29F80: malloc (vg_replace_malloc.c:296)
==16768== by 0x52603B9: strdup (strdup.c:42)
==16768== by 0x66222E4: virStrdup (in /usr/lib64/libvirt.so.0.2000.0)
==16768== by 0x662B92A: virTypedParamsDeserialize (in /usr/lib64/libvirt.so.0.2000.0)
==16768== by 0x671D7F2: remoteDomainGetNumaParameters (in
/usr/lib64/libvirt.so.0.2000.0)
==16768== by 0x66CA1BE: virDomainGetNumaParameters (in /usr/lib64/libvirt.so.0.2000.0)
==16768== by 0x630CF74: XS_Sys__Virt__Domain_get_numa_parameters (Virt.xs:4224)
==16768== by 0x4EF920A: Perl_pp_entersub (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x4EF1A42: Perl_runops_standard (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x4E8BE58: perl_run (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x400D9A: main (in /usr/bin/perl)
==16768== 672 bytes in 1 blocks are definitely lost in loss record 6,993 of 7,378
==16768== at 0x4C29F80: malloc (vg_replace_malloc.c:296)
==16768== by 0x4ED6984: Perl_safesysmalloc (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x63164DF: XS_Sys__Virt__Domain_set_interface_parameters (Virt.xs:5024)
==16768== by 0x4EF920A: Perl_pp_entersub (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x4EF1A42: Perl_runops_standard (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x4E8BE58: perl_run (in /usr/lib64/libperl.so.5.20.2)
==16768== by 0x400D9A: main (in /usr/bin/perl)
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
Virt.xs | 90 +++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 46 insertions(+), 44 deletions(-)
diff --git a/Virt.xs b/Virt.xs
index cf4e5bc..3b59f8a 100644
--- a/Virt.xs
+++ b/Virt.xs
@@ -2246,12 +2246,12 @@ get_node_memory_parameters(conn, flags=0)
Newx(params, nparams, virTypedParameter);
if (virNodeGetMemoryParameters(conn, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -2272,7 +2272,7 @@ set_node_memory_parameters(conn, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (virNodeGetMemoryParameters(conn, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -2280,7 +2280,7 @@ set_node_memory_parameters(conn, newparams, flags=0)
if (virNodeSetMemoryParameters(conn, params, nparams, flags) < 0)
_croak_error();
- Safefree(params);
+ virTypedParamsFree(params, nparams);
@@ -3924,13 +3924,13 @@ get_job_stats(dom, flags=0)
SV *typeSv;
PPCODE:
if (virDomainGetJobStats(dom, &type, ¶ms, &nparams, flags) < 0)
{
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
typeSv = newSViv(type);
paramsHv = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
EXTEND(SP, 2);
PUSHs(newRV_noinc((SV*)typeSv));
@@ -4038,11 +4038,11 @@ block_copy(dom, path, destxml, newparams, flags=0)
nparams = vir_typed_param_from_hv(newparams, params, nparams);
if (virDomainBlockCopy(dom, path, destxml, params, nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
void
@@ -4103,17 +4103,17 @@ get_scheduler_parameters(dom, flags=0)
Newx(params, nparams, virTypedParameter);
if (flags) {
if (virDomainGetSchedulerParametersFlags(dom, params, &nparams, flags) <
0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
} else {
if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4135,12 +4135,12 @@ set_scheduler_parameters(dom, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (flags) {
if (virDomainGetSchedulerParametersFlags(dom, params, &nparams, flags) <
0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
} else {
if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
}
@@ -4152,7 +4152,7 @@ set_scheduler_parameters(dom, newparams, flags=0)
if (virDomainSetSchedulerParameters(dom, params, nparams) < 0)
_croak_error();
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
HV *
@@ -4170,12 +4170,12 @@ get_memory_parameters(dom, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetMemoryParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4196,7 +4196,7 @@ set_memory_parameters(dom, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetMemoryParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -4204,7 +4204,7 @@ set_memory_parameters(dom, newparams, flags=0)
if (virDomainSetMemoryParameters(dom, params, nparams, flags) < 0)
_croak_error();
- Safefree(params);
+ virTypedParamsFree(params, nparams);
HV *
@@ -4222,12 +4222,12 @@ get_numa_parameters(dom, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetNumaParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4248,7 +4248,7 @@ set_numa_parameters(dom, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetNumaParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -4256,7 +4256,7 @@ set_numa_parameters(dom, newparams, flags=0)
if (virDomainSetNumaParameters(dom, params, nparams, flags) < 0)
_croak_error();
- Safefree(params);
+ virTypedParamsFree(params, nparams);
HV *
@@ -4274,12 +4274,12 @@ get_blkio_parameters(dom, flags=0)
Newx(params, nparams, virBlkioParameter);
if (virDomainGetBlkioParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4300,7 +4300,7 @@ set_blkio_parameters(dom, newparams, flags=0)
Newx(params, nparams, virBlkioParameter);
if (virDomainGetBlkioParameters(dom, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -4309,7 +4309,7 @@ set_blkio_parameters(dom, newparams, flags=0)
if (virDomainSetBlkioParameters(dom, params, nparams,
flags) < 0)
_croak_error();
- Safefree(params);
+ virTypedParamsFree(params, nparams);
HV *
@@ -4321,12 +4321,12 @@ get_perf_events(dom, flags=0)
int nparams = 0;
CODE:
if (virDomainGetPerfEvents(dom, ¶ms, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4341,7 +4341,7 @@ set_perf_events(dom, newparams, flags=0)
int nparams = 0;
PPCODE:
if (virDomainGetPerfEvents(dom, ¶ms, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -4349,7 +4349,7 @@ set_perf_events(dom, newparams, flags=0)
if (virDomainSetPerfEvents(dom, params, nparams, flags) < 0)
_croak_error();
- Safefree(params);
+ virTypedParamsFree(params, nparams);
unsigned long
@@ -4719,10 +4719,10 @@ _migrate(dom, destcon, newparams, flags=0)
* if it is possible todo so
*/
if ((RETVAL = virDomainMigrate3(dom, destcon, params, nparams, flags)) == NULL) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4810,10 +4810,10 @@ _migrate_to_uri(dom, desturi, newparams, flags=0)
* if it is possible todo so
*/
if (virDomainMigrateToURI3(dom, desturi, params, nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
void
@@ -4947,12 +4947,12 @@ get_block_iotune(dom, disk, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetBlockIoTune(dom, disk, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -4973,13 +4973,14 @@ set_block_iotune(dom, disk, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetBlockIoTune(dom, disk, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
nparams = vir_typed_param_from_hv(newparams, params, nparams);
if (virDomainSetBlockIoTune(dom, disk, params, nparams, flags) < 0)
_croak_error();
+ virTypedParamsFree(params, nparams);
HV *
@@ -4998,12 +4999,12 @@ get_interface_parameters(dom, intf, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetInterfaceParameters(dom, intf, params, &nparams, flags) < 0)
{
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
RETVAL = vir_typed_param_to_hv(params, nparams);
- Safefree(params);
+ virTypedParamsFree(params, nparams);
OUTPUT:
RETVAL
@@ -5024,13 +5025,14 @@ set_interface_parameters(dom, intf, newparams, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainGetInterfaceParameters(dom, intf, params, &nparams, flags) < 0)
{
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
nparams = vir_typed_param_from_hv(newparams, params, nparams);
if (virDomainSetInterfaceParameters(dom, intf, params, nparams, flags) < 0)
_croak_error();
+ virTypedParamsFree(params, nparams);
HV *
@@ -5066,7 +5068,7 @@ block_stats(dom, path, flags=0)
Newx(params, nparams, virTypedParameter);
if (virDomainBlockStatsFlags(dom, path, params, &nparams, flags) < 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -5086,7 +5088,7 @@ block_stats(dom, path, flags=0)
(void)hv_store(RETVAL, field, strlen(field), val, 0);
}
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
}
OUTPUT:
RETVAL
@@ -5312,7 +5314,7 @@ get_cpu_stats(dom, start_cpu, ncpus, flags=0)
Newx(params, ncpus * nparams, virTypedParameter);
if ((ret = virDomainGetCPUStats(dom, params, nparams, start_cpu, ncpus, flags))
< 0) {
- Safefree(params);
+ virTypedParamsFree(params, nparams);
_croak_error();
}
@@ -5322,7 +5324,7 @@ get_cpu_stats(dom, start_cpu, ncpus, flags=0)
PUSHs(newRV_noinc((SV *)rec));
}
- Safefree(params);
+ virTypedParamsFree(params, nparams);
void
--
2.8.4