This seems like a clear indication that the way these APIs are used in
practice means is more suited to passing a buffer as an argument.
On 04/06/11 14:54, Jaroslav Škarvada wrote:
This is attempt to fix several (not all) memory leaks.
---
src/config/config-qmf.cpp | 8 ++++++--
src/host/host-dbus.c | 19 +++++++++++++------
src/host/host-qmf.cpp | 19 +++++++++++++------
src/network/network-dbus.c | 10 +++++++---
src/network/network-qmf.cpp | 18 ++++++++++++++----
src/service/service-qmf-console.cpp | 5 ++++-
src/service/service-qmf.cpp | 14 ++++++++++----
7 files changed, 67 insertions(+), 26 deletions(-)
diff --git a/src/config/config-qmf.cpp b/src/config/config-qmf.cpp
index de3e669..8244cb6 100644
--- a/src/config/config-qmf.cpp
+++ b/src/config/config-qmf.cpp
@@ -63,11 +63,15 @@ main(int argc, char **argv)
int
ConfigAgent::setup(qmf::AgentSession session)
{
+ char *str;
+
_package.configure(session);
_instance = qmf::Data(_package.data_Config);
- _instance.setProperty("hostname", mh_hostname());
- _instance.setProperty("uuid", mh_uuid());
+ _instance.setProperty("hostname", str = (char *)mh_hostname());
+ free(str);
+ _instance.setProperty("uuid", str = (char *)mh_uuid());
+ free(str);
_instance.setProperty("is_configured", mh_is_configured());
_agent_session.addData(_instance, "config");
diff --git a/src/host/host-dbus.c b/src/host/host-dbus.c
index 612b457..6368eb7 100644
--- a/src/host/host-dbus.c
+++ b/src/host/host-dbus.c
@@ -114,19 +114,24 @@ matahari_get_property(GObject *object, guint property_id, GValue
*value,
sigar_loadavg_t avg;
Dict *dict;
GValue value_value = {0, };
+ char *str;
switch (property_id) {
case PROP_UUID:
- g_value_set_string (value, mh_host_get_uuid());
+ g_value_set_string (value, str = (char *)mh_host_get_uuid());
+ free(str);
break;
case PROP_HOSTNAME:
- g_value_set_string (value, mh_host_get_hostname());
+ g_value_set_string (value, str = (char *)mh_host_get_hostname());
+ free(str);
break;
case PROP_OS:
- g_value_set_string (value, mh_host_get_operating_system());
+ g_value_set_string (value, str = (char *)mh_host_get_operating_system());
+ g_free(str);
break;
case PROP_ARCH:
- g_value_set_string (value, mh_host_get_architecture());
+ g_value_set_string (value, str = (char *)mh_host_get_architecture());
+ g_free(str);
break;
case PROP_WORDSIZE:
g_value_set_uint (value, mh_host_get_cpu_wordsize());
@@ -144,10 +149,12 @@ matahari_get_property(GObject *object, guint property_id, GValue
*value,
g_value_set_uint (value, mh_host_get_cpu_number_of_cores());
break;
case PROP_CPU_MODEL:
- g_value_set_string (value, mh_host_get_cpu_model());
+ g_value_set_string (value, str = (char *)mh_host_get_cpu_model());
+ g_free(str);
break;
case PROP_CPU_FLAGS:
- g_value_set_string (value, mh_host_get_cpu_flags());
+ g_value_set_string (value, str = (char *)mh_host_get_cpu_flags());
+ free(str);
break;
case PROP_UPDATE_INTERVAL:
g_value_set_uint (value, priv.update_interval);
diff --git a/src/host/host-qmf.cpp b/src/host/host-qmf.cpp
index 7547daf..1561226 100644
--- a/src/host/host-qmf.cpp
+++ b/src/host/host-qmf.cpp
@@ -94,21 +94,28 @@ bail:
int
HostAgent::setup(qmf::AgentSession session)
{
+ char *str;
_package.configure(session);
_instance = qmf::Data(_package.data_Host);
_instance.setProperty("update_interval", 5);
- _instance.setProperty("uuid", mh_host_get_uuid());
- _instance.setProperty("hostname", mh_host_get_hostname());
- _instance.setProperty("os", mh_host_get_operating_system());
+ _instance.setProperty("uuid", str = (char *)mh_host_get_uuid());
+ free(str);
+ _instance.setProperty("hostname", str = (char *)mh_host_get_hostname());
+ free(str);
+ _instance.setProperty("os", str = (char
*)mh_host_get_operating_system());
+ g_free(str);
_instance.setProperty("wordsize", mh_host_get_cpu_wordsize());
- _instance.setProperty("arch", mh_host_get_architecture());
+ _instance.setProperty("arch", str = (char *)mh_host_get_architecture());
+ g_free(str);
_instance.setProperty("memory", mh_host_get_memory());
_instance.setProperty("swap", mh_host_get_swap());
_instance.setProperty("cpu_count", mh_host_get_cpu_count());
_instance.setProperty("cpu_cores", mh_host_get_cpu_number_of_cores());
- _instance.setProperty("cpu_model", mh_host_get_cpu_model());
- _instance.setProperty("cpu_flags", mh_host_get_cpu_flags());
+ _instance.setProperty("cpu_model", str = (char
*)mh_host_get_cpu_model());
+ g_free(str);
+ _instance.setProperty("cpu_flags", str = (char
*)mh_host_get_cpu_flags());
+ free(str);
session.addData(_instance);
return 0;
diff --git a/src/network/network-dbus.c b/src/network/network-dbus.c
index 31040d2..49dd657 100644
--- a/src/network/network-dbus.c
+++ b/src/network/network-dbus.c
@@ -83,6 +83,7 @@ Network_list(Matahari *matahari, DBusGMethodInvocation *context)
plist = g_list_next(plist)) {
ifconfig = (sigar_net_interface_config_t *)plist->data;
list[i++] = strdup(ifconfig->name);
+ g_free(plist->data);
}
list[i] = NULL; // Sentinel
@@ -159,7 +160,7 @@ Network_get_ip_address(Matahari *matahari, const char *iface,
return FALSE;
}
- dbus_g_method_return(context, g_strdup(mh_network_get_ip_address(iface)));
+ dbus_g_method_return(context, mh_network_get_ip_address(iface));
return TRUE;
}
@@ -174,7 +175,7 @@ Network_get_mac_address(Matahari *matahari, const char *iface,
return FALSE;
}
- dbus_g_method_return(context, g_strdup(mh_network_get_mac_address(iface)));
+ dbus_g_method_return(context, mh_network_get_mac_address(iface));
return TRUE;
}
@@ -195,9 +196,12 @@ void
matahari_get_property(GObject *object, guint property_id, GValue *value,
GParamSpec *pspec)
{
+ char *str;
+
switch (property_id) {
case PROP_HOSTNAME:
- g_value_set_string (value, mh_hostname());
+ g_value_set_string (value, str = (char *)mh_hostname());
+ free(str);
break;
default:
/* We don't have any other property... */
diff --git a/src/network/network-qmf.cpp b/src/network/network-qmf.cpp
index 8e9e247..fb501ec 100644
--- a/src/network/network-qmf.cpp
+++ b/src/network/network-qmf.cpp
@@ -77,11 +77,15 @@ interface_status(const char *iface)
int
NetAgent::setup(qmf::AgentSession session)
{
+ char *str;
+
_package.configure(session);
_instance = qmf::Data(_package.data_Network);
- _instance.setProperty("hostname", mh_hostname());
- _instance.setProperty("uuid", mh_uuid());
+ _instance.setProperty("hostname", str = (char *)mh_hostname());
+ free(str);
+ _instance.setProperty("uuid", str = (char *)mh_uuid());
+ free(str);
_agent_session.addData(_instance);
return 0;
@@ -91,6 +95,8 @@ gboolean
NetAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event,
gpointer user_data)
{
+ char *str;
+
if (event.getType() != qmf::AGENT_METHOD) {
session.methodSuccess(event);
return TRUE;
@@ -110,7 +116,9 @@ NetAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event,
plist = g_list_next(plist)) {
ifconfig = (sigar_net_interface_config_t *)plist->data;
s_list.push_back(ifconfig->name);
+ g_free(plist->data);
}
+ g_list_free(interface_list);
event.addReturnArgument("iface_map", s_list);
} else if (methodName == "start") {
int rc = interface_status(
@@ -135,11 +143,13 @@ NetAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event,
event.addReturnArgument("status", interface_status(
event.getArguments()["iface"].asString().c_str()));
} else if (methodName == "get_ip_address") {
- event.addReturnArgument("ip", mh_network_get_ip_address(
+ event.addReturnArgument("ip", str = (char
*)mh_network_get_ip_address(
event.getArguments()["iface"].asString().c_str()));
+ g_free(str);
} else if (methodName == "get_mac_address") {
- event.addReturnArgument("mac", mh_network_get_mac_address(
+ event.addReturnArgument("mac", str = (char
*)mh_network_get_mac_address(
event.getArguments()["iface"].asString().c_str()));
+ g_free(str);
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
goto bail;
diff --git a/src/service/service-qmf-console.cpp b/src/service/service-qmf-console.cpp
index dac8bca..406ce7e 100644
--- a/src/service/service-qmf-console.cpp
+++ b/src/service/service-qmf-console.cpp
@@ -70,9 +70,12 @@ int main(int argc, char** argv)
string sessionOptions;
ConsoleEvent event;
Agent agent;
+ char *str;
options["api"] = "Resources";
- options["host-dns"] = mh_hostname();
+ str = (char *)mh_hostname();
+ options["host-dns"] = str;
+ free(str);
options["standard"] = "ocf";
options["provider"] = "heartbeat";
options["interval"] = 0;
diff --git a/src/service/service-qmf.cpp b/src/service/service-qmf.cpp
index f02fb80..cc970ee 100644
--- a/src/service/service-qmf.cpp
+++ b/src/service/service-qmf.cpp
@@ -213,6 +213,8 @@ SrvAgent::raiseEvent(svc_action_t *op, enum service_id service, const
char *user
int
SrvAgent::setup(qmf::AgentSession session)
{
+ char *str;
+
#ifdef __linux__
standards.push_back("ocf");
#endif
@@ -225,15 +227,19 @@ SrvAgent::setup(qmf::AgentSession session)
_services = qmf::Data(_package.data_Services);
- _services.setProperty("uuid", mh_uuid());
- _services.setProperty("hostname", mh_hostname());
+ _services.setProperty("uuid", str = (char *)mh_uuid());
+ free(str);
+ _services.setProperty("hostname", str = (char *)mh_hostname());
+ free(str);
session.addData(_services, "Services");
_resources = qmf::Data(_package.data_Resources);
- _resources.setProperty("uuid", mh_uuid());
- _resources.setProperty("hostname", mh_hostname());
+ _resources.setProperty("uuid", str = (char *)mh_uuid());
+ free(str);
+ _resources.setProperty("hostname", str = (char *)mh_hostname());
+ free(str);
session.addData(_resources, "Resources");