It's harder to track which variables were free()-d if the free()
call is hidden in the macro. Moreover, since we don't have a
wrapper over free() that will set the pointer to NULL, we may end
up double freeing something.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/libvirt-php.c | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index a532525..5bff720 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -1530,10 +1530,9 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, args,
__VA_ARGS__) == FAILU
ZEND_FETCH_RESOURCE(snapshot, php_libvirt_snapshot*, &zsnapshot, -1,
PHP_LIBVIRT_SNAPSHOT_RES_NAME, le_libvirt_snapshot);\
if ((snapshot==NULL) || (snapshot->snapshot==NULL)) RETURN_FALSE;\
-/* Macro to "recreate" string with emalloc and free the original one */
+/* Macro to "recreate" string with emalloc */
#define RECREATE_STRING_WITH_E(str_out, str_in) \
- str_out = estrndup(str_in, strlen(str_in)); \
-free(str_in); \
+ str_out = estrdup(str_in);
#define LONGLONG_INIT \
char tmpnumber[64];
@@ -2225,6 +2224,7 @@ PHP_FUNCTION(libvirt_connect_get_uri)
if (uri == NULL) RETURN_FALSE;
RECREATE_STRING_WITH_E(uri_out, uri);
+ free(uri);
RETURN_STRING(uri_out, 0);
}
@@ -2249,7 +2249,7 @@ PHP_FUNCTION(libvirt_connect_get_hostname)
if (hostname==NULL) RETURN_FALSE;
RECREATE_STRING_WITH_E(hostname_out,hostname);
-
+ free(hostname);
RETURN_STRING(hostname_out,0);
}
@@ -2557,7 +2557,7 @@ PHP_FUNCTION(libvirt_connect_get_sysinfo)
if (sysinfo==NULL) RETURN_FALSE;
RECREATE_STRING_WITH_E(sysinfo_out, sysinfo);
-
+ free(sysinfo);
RETURN_STRING(sysinfo_out,0);
}
@@ -4491,6 +4491,9 @@ PHP_FUNCTION(libvirt_connect_get_capabilities)
RECREATE_STRING_WITH_E (caps_out, tmp);
}
+ free(caps);
+ free(tmp);
+
RETURN_STRING(caps_out,0);
}
@@ -4523,7 +4526,7 @@ PHP_FUNCTION(libvirt_connect_get_emulator)
}
RECREATE_STRING_WITH_E(emulator, tmp);
-
+ free(tmp);
RETURN_STRING(emulator, 0);
}
@@ -4993,6 +4996,9 @@ PHP_FUNCTION(libvirt_domain_get_xml_desc)
RECREATE_STRING_WITH_E (xml_out, tmp);
}
+ free(tmp);
+ free(xml);
+
RETURN_STRING(xml_out,0);
}
@@ -6726,7 +6732,7 @@ PHP_FUNCTION(libvirt_domain_snapshot_get_xml)
if (xml==NULL) RETURN_FALSE;
RECREATE_STRING_WITH_E(xml_out,xml);
-
+ free(xml);
RETURN_STRING(xml_out,0);
}
@@ -7130,6 +7136,9 @@ PHP_FUNCTION(libvirt_storagevolume_get_xml_desc)
RECREATE_STRING_WITH_E(xml_out, tmp);
}
+ free(xml);
+ free(tmp);
+
RETURN_STRING(xml_out,0);
}
@@ -7474,6 +7483,9 @@ PHP_FUNCTION(libvirt_storagepool_get_xml_desc)
RECREATE_STRING_WITH_E (xml_out, tmp);
}
+ free(xml);
+ free(tmp);
+
RETURN_STRING (xml_out, 0);
}
@@ -8361,6 +8373,9 @@ PHP_FUNCTION(libvirt_nodedev_get_xml_desc)
RECREATE_STRING_WITH_E (xml_out, tmp);
}
+ free(xml);
+ free(tmp);
+
RETURN_STRING(xml_out, 0);
}
@@ -8808,6 +8823,9 @@ PHP_FUNCTION(libvirt_network_get_xml_desc)
RECREATE_STRING_WITH_E (xml_out, tmp);
}
+ free(xml);
+ free(tmp);
+
RETURN_STRING(xml_out, 0);
}
--
2.4.9