From fdd09340ce85ab4258fcf4d1d52abcf4dd0be8c5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:28:18 +0100 Subject: [PATCH 01/37] cli: fix memleak in nmc_setting_get_valid_properties() --- clients/cli/settings.c | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 5d003fad92..78947f04c3 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -6532,6 +6532,7 @@ nmc_setting_get_valid_properties (NMSetting *setting) valid_props[i++] = g_strdup (key_name); } valid_props[i] = NULL; + g_free (props); return valid_props; } From 052198f4b92f7c218c29304f7d2de4f0150728fb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 13:53:16 +0100 Subject: [PATCH 02/37] libnm: fix memleak for app_fcoe_mode in NMSettingDcb --- libnm-core/nm-setting-dcb.c | 14 +++++++++++++- libnm-util/nm-setting-dcb.c | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/libnm-core/nm-setting-dcb.c b/libnm-core/nm-setting-dcb.c index a4fa00c840..915cc41f2e 100644 --- a/libnm-core/nm-setting-dcb.c +++ b/libnm-core/nm-setting-dcb.c @@ -50,7 +50,7 @@ NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_DCB) typedef struct { NMSettingDcbFlags app_fcoe_flags; gint app_fcoe_priority; - const char * app_fcoe_mode; + char * app_fcoe_mode; NMSettingDcbFlags app_iscsi_flags; gint app_iscsi_priority; @@ -793,6 +793,7 @@ set_property (GObject *object, guint prop_id, priv->app_fcoe_priority = g_value_get_int (value); break; case PROP_APP_FCOE_MODE: + g_free (priv->app_fcoe_mode); priv->app_fcoe_mode = g_value_dup_string (value); break; case PROP_APP_ISCSI_FLAGS: @@ -896,6 +897,16 @@ get_property (GObject *object, guint prop_id, } } +static void +finalize (GObject *object) +{ + NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); + + g_free (priv->app_fcoe_mode); + + G_OBJECT_CLASS (nm_setting_dcb_parent_class)->finalize (object); +} + static void nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) { @@ -907,6 +918,7 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) /* virtual methods */ object_class->set_property = set_property; object_class->get_property = get_property; + object_class->finalize = finalize; parent_class->verify = verify; /* Properties */ diff --git a/libnm-util/nm-setting-dcb.c b/libnm-util/nm-setting-dcb.c index 2376581e76..89ee387852 100644 --- a/libnm-util/nm-setting-dcb.c +++ b/libnm-util/nm-setting-dcb.c @@ -78,7 +78,7 @@ NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_DCB) typedef struct { NMSettingDcbFlags app_fcoe_flags; gint app_fcoe_priority; - const char * app_fcoe_mode; + char * app_fcoe_mode; NMSettingDcbFlags app_iscsi_flags; gint app_iscsi_priority; @@ -833,6 +833,7 @@ set_property (GObject *object, guint prop_id, priv->app_fcoe_priority = g_value_get_int (value); break; case PROP_APP_FCOE_MODE: + g_free (priv->app_fcoe_mode); priv->app_fcoe_mode = g_value_dup_string (value); break; case PROP_APP_ISCSI_FLAGS: @@ -944,6 +945,16 @@ get_property (GObject *object, guint prop_id, } } +static void +finalize (GObject *object) +{ + NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); + + g_free (priv->app_fcoe_mode); + + G_OBJECT_CLASS (nm_setting_dcb_parent_class)->finalize (object); +} + static void nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) { @@ -955,6 +966,7 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) /* virtual methods */ object_class->set_property = set_property; object_class->get_property = get_property; + object_class->finalize = finalize; parent_class->verify = verify; /* Properties */ From 8cb6d70e5b91170c7b89ede53078025be959a9f2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:21:30 +0100 Subject: [PATCH 03/37] libnm: fix memleak for config in NMSettingTeamPort --- libnm-core/nm-setting-team-port.c | 12 ++++++++++++ libnm-util/nm-setting-team-port.c | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c index b5125753c3..7fbf8620f1 100644 --- a/libnm-core/nm-setting-team-port.c +++ b/libnm-core/nm-setting-team-port.c @@ -130,6 +130,7 @@ set_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_CONFIG: + g_free (priv->config); priv->config = g_value_dup_string (value); break; default: @@ -154,6 +155,16 @@ get_property (GObject *object, guint prop_id, } } +static void +finalize (GObject *object) +{ + NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (object); + + g_free (priv->config); + + G_OBJECT_CLASS (nm_setting_team_port_parent_class)->finalize (object); +} + static void nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class) { @@ -165,6 +176,7 @@ nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class) /* virtual methods */ object_class->set_property = set_property; object_class->get_property = get_property; + object_class->finalize = finalize; parent_class->verify = verify; /* Properties */ diff --git a/libnm-util/nm-setting-team-port.c b/libnm-util/nm-setting-team-port.c index 6bc71c981d..9992f58a28 100644 --- a/libnm-util/nm-setting-team-port.c +++ b/libnm-util/nm-setting-team-port.c @@ -130,6 +130,7 @@ set_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_CONFIG: + g_free (priv->config); priv->config = g_value_dup_string (value); break; default: @@ -154,6 +155,16 @@ get_property (GObject *object, guint prop_id, } } +static void +finalize (GObject *object) +{ + NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (object); + + g_free (priv->config); + + G_OBJECT_CLASS (nm_setting_team_port_parent_class)->finalize (object); +} + static void nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class) { @@ -165,6 +176,7 @@ nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class) /* virtual methods */ object_class->set_property = set_property; object_class->get_property = get_property; + object_class->finalize = finalize; parent_class->verify = verify; /* Properties */ From 66be46309ac6db6afda4412038bfc1130aba51ec Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 15:22:37 +0100 Subject: [PATCH 04/37] libnm: fix memleak in nm_utils_ip_addresses_from_variant() --- libnm-core/nm-utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 4532ab26db..321c03f18c 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -1802,6 +1802,7 @@ nm_utils_ip_addresses_from_variant (GVariant *value, g_variant_unref (attr_val); } + g_variant_unref (addr_var); g_ptr_array_add (addresses, addr); } From fffd93b5c49ccf4d0a13df73d54c7a0152456436 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 15:46:09 +0100 Subject: [PATCH 05/37] libnm: fix memleak in nm_connection_replace_settings() --- libnm-core/nm-connection.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c index 239079e3b1..79ff31d89d 100644 --- a/libnm-core/nm-connection.c +++ b/libnm-core/nm-connection.c @@ -304,6 +304,8 @@ nm_connection_replace_settings (NMConnection *connection, for (s = settings; s; s = s->next) _nm_connection_add_setting (connection, s->data); + g_slist_free (settings); + if (changed) g_signal_emit (connection, signals[CHANGED], 0); return TRUE; From f1bfe459eef14fa4d9e71d400362bdcc06a38bdc Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 16:36:55 +0100 Subject: [PATCH 06/37] libnm: fix memleak in find_virtual_interface_name() --- libnm-core/nm-setting-connection.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c index 01f5d423c1..7bc927bc1d 100644 --- a/libnm-core/nm-setting-connection.c +++ b/libnm-core/nm-setting-connection.c @@ -968,8 +968,9 @@ find_virtual_interface_name (GVariant *connection_dict) /* All of the deprecated virtual interface name properties were named "interface-name". */ if (!g_variant_lookup (setting_dict, "interface-name", "&s", &interface_name)) - return NULL; + interface_name = NULL; + g_variant_unref (setting_dict); return interface_name; } From 7a82d64e475fd346638707af76e9f1f63fec204c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:52:43 +0100 Subject: [PATCH 07/37] libnm: fix memleak in nm_setting_wired_get_s390_option() and refactor @keys was leaked. Also refactor the function to iterate the hash only once. --- libnm-core/nm-setting-wired.c | 33 +++++++++++++++------------------ libnm-util/nm-setting-wired.c | 33 +++++++++++++++------------------ 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/libnm-core/nm-setting-wired.c b/libnm-core/nm-setting-wired.c index ac143e45df..2a7479405d 100644 --- a/libnm-core/nm-setting-wired.c +++ b/libnm-core/nm-setting-wired.c @@ -434,27 +434,24 @@ nm_setting_wired_get_s390_option (NMSettingWired *setting, const char **out_key, const char **out_value) { - NMSettingWiredPrivate *priv; - guint32 num_keys; - GList *keys; - const char *_key = NULL, *_value = NULL; + const char *_key, *_value; + GHashTableIter iter; + guint i = 0; g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - - num_keys = nm_setting_wired_get_num_s390_options (setting); - g_return_val_if_fail (idx < num_keys, FALSE); - - keys = g_hash_table_get_keys (priv->s390_options); - _key = g_list_nth_data (keys, idx); - _value = g_hash_table_lookup (priv->s390_options, _key); - - if (out_key) - *out_key = _key; - if (out_value) - *out_value = _value; - return TRUE; + g_hash_table_iter_init (&iter, NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options); + while (g_hash_table_iter_next (&iter, (gpointer) &_key, (gpointer) &_value)) { + if (i == idx) { + if (out_key) + *out_key = _key; + if (out_value) + *out_value = _value; + return TRUE; + } + i++; + } + g_return_val_if_reached (FALSE); } /** diff --git a/libnm-util/nm-setting-wired.c b/libnm-util/nm-setting-wired.c index 8d927921db..aba5fb9831 100644 --- a/libnm-util/nm-setting-wired.c +++ b/libnm-util/nm-setting-wired.c @@ -474,27 +474,24 @@ nm_setting_wired_get_s390_option (NMSettingWired *setting, const char **out_key, const char **out_value) { - NMSettingWiredPrivate *priv; - guint32 num_keys; - GList *keys; - const char *_key = NULL, *_value = NULL; + const char *_key, *_value; + GHashTableIter iter; + guint i = 0; g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); - - num_keys = nm_setting_wired_get_num_s390_options (setting); - g_return_val_if_fail (idx < num_keys, FALSE); - - keys = g_hash_table_get_keys (priv->s390_options); - _key = g_list_nth_data (keys, idx); - _value = g_hash_table_lookup (priv->s390_options, _key); - - if (out_key) - *out_key = _key; - if (out_value) - *out_value = _value; - return TRUE; + g_hash_table_iter_init (&iter, NM_SETTING_WIRED_GET_PRIVATE (setting)->s390_options); + while (g_hash_table_iter_next (&iter, (gpointer) &_key, (gpointer) &_value)) { + if (i == idx) { + if (out_key) + *out_key = _key; + if (out_value) + *out_value = _value; + return TRUE; + } + i++; + } + g_return_val_if_reached (FALSE); } /** From 137e496ef1a24d3da59e2188a5a8bb08a45bc49a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 11:31:29 +0100 Subject: [PATCH 08/37] libnm: fix memleaks in nm_setting_802_1x --- libnm-core/nm-setting-8021x.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libnm-core/nm-setting-8021x.c b/libnm-core/nm-setting-8021x.c index f4884b5c81..41559e0c8a 100644 --- a/libnm-core/nm-setting-8021x.c +++ b/libnm-core/nm-setting-8021x.c @@ -1884,6 +1884,7 @@ nm_setting_802_1x_get_private_key_format (NMSetting8021x *setting) g_error_free (error); return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; } + g_error_free (error); return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; default: break; @@ -2164,6 +2165,7 @@ nm_setting_802_1x_get_phase2_private_key_format (NMSetting8021x *setting) g_error_free (error); return NM_SETTING_802_1X_CK_FORMAT_UNKNOWN; } + g_error_free (error); return NM_SETTING_802_1X_CK_FORMAT_RAW_KEY; default: break; From 1567a9f7125f0384226bced6ae8c92346251439c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:30:54 +0100 Subject: [PATCH 09/37] libnm: fix memleak in _nm_dbus_bind_properties() --- libnm/nm-dbus-helpers.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libnm/nm-dbus-helpers.c b/libnm/nm-dbus-helpers.c index 7a99e70d25..6bfd4bbd83 100644 --- a/libnm/nm-dbus-helpers.c +++ b/libnm/nm-dbus-helpers.c @@ -349,6 +349,7 @@ _nm_dbus_bind_properties (gpointer object, gpointer skeleton) skeleton, properties[i]->name, G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); } + g_free (properties); } static char * From 027ab3efaa4c3e0de12f921df6854373910b06e7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:09:48 +0100 Subject: [PATCH 10/37] libnm-util: only unref and don't destroy hash in nm_connection_to_hash() The returned hash from nm_connection_to_hash() used to destroy the nested hashes, instead of only unrefing them. --- libnm-util/nm-connection.c | 2 +- libnm-util/tests/test-secrets.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c index a1350f5445..3a929b045f 100644 --- a/libnm-util/nm-connection.c +++ b/libnm-util/nm-connection.c @@ -1241,7 +1241,7 @@ nm_connection_to_hash (NMConnection *connection, NMSettingHashFlags flags) g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); ret = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, (GDestroyNotify) g_hash_table_destroy); + g_free, (GDestroyNotify) g_hash_table_unref); priv = NM_CONNECTION_GET_PRIVATE (connection); diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c index fb0ad4c7e5..9f0407e4e1 100644 --- a/libnm-util/tests/test-secrets.c +++ b/libnm-util/tests/test-secrets.c @@ -650,20 +650,22 @@ test_update_secrets_whole_connection_bad_setting (void) secrets = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); wsec_hash = g_hash_table_lookup (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); g_assert (wsec_hash); - g_hash_table_insert (wsec_hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); + g_hash_table_insert (wsec_hash, g_strdup (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0), string_to_gvalue (wepkey)); /* Steal the wsec setting hash so it's not deallocated, and stuff it back * in with a different name so we ensure libnm-util is returning the right * error when it finds an entry in the connection hash that doesn't match * any setting in the connection. */ - g_hash_table_steal (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); - g_hash_table_insert (secrets, "asdfasdfasdfasdf", wsec_hash); + g_hash_table_ref (wsec_hash); + g_hash_table_remove (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); + g_hash_table_insert (secrets, g_strdup ("asdfasdfasdfasdf"), wsec_hash); success = nm_connection_update_secrets (connection, NULL, secrets, &error); g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (success == FALSE); + g_hash_table_destroy (secrets); g_object_unref (connection); } From b49fdae59eb443632503ed6dc589df27cd2de0c1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:04:06 +0100 Subject: [PATCH 11/37] config: fix memleak in read_config() --- src/nm-config.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/nm-config.c b/src/nm-config.c index 03fca56b73..d28ed86fbb 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -471,8 +471,8 @@ read_config (GKeyFile *keyfile, const char *path, GError **error) if (keys[k][len - 1] == '+') { char *base_key = g_strndup (keys[k], len - 1); - const char *old_val = g_key_file_get_value (keyfile, groups[g], base_key, NULL); - const char *new_val = g_key_file_get_value (kf, groups[g], keys[k], NULL); + char *old_val = g_key_file_get_value (keyfile, groups[g], base_key, NULL); + char *new_val = g_key_file_get_value (kf, groups[g], keys[k], NULL); if (old_val && *old_val) { char *combined = g_strconcat (old_val, ",", new_val, NULL); @@ -483,6 +483,8 @@ read_config (GKeyFile *keyfile, const char *path, GError **error) g_key_file_set_value (keyfile, groups[g], base_key, new_val); g_free (base_key); + g_free (old_val); + g_free (new_val); continue; } From b7cb109ad310da27e2a5055723910d169e9ab2ab Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:42:03 +0100 Subject: [PATCH 12/37] config: fix memleak in NMConfigData keyfile --- src/nm-config-data.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nm-config-data.c b/src/nm-config-data.c index f1a7bcfc62..270c302f12 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -286,6 +286,8 @@ finalize (GObject *gobject) g_slist_free (priv->no_auto_default.specs); g_strfreev (priv->no_auto_default.arr); + g_key_file_unref (priv->keyfile); + G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject); } From 9d8f93384a017e330261b3cafaf00422e09c7c38 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:22:06 +0100 Subject: [PATCH 13/37] keyfile: fix memleak in parity_parser() --- src/settings/plugins/keyfile/reader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c index 1575f01727..1a1d9663d3 100644 --- a/src/settings/plugins/keyfile/reader.c +++ b/src/settings/plugins/keyfile/reader.c @@ -869,6 +869,7 @@ parity_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const cha int_val = 'X'; } } + g_free (str_val); } if (!int_val) From 494c5c395da5a358f16f5960c9de7b08aac17d01 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:00:45 +0100 Subject: [PATCH 14/37] ibft: fix memleak in read_ibft_blocks() --- src/settings/plugins/ibft/reader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/settings/plugins/ibft/reader.c b/src/settings/plugins/ibft/reader.c index bcbfa33002..e3a0168a6c 100644 --- a/src/settings/plugins/ibft/reader.c +++ b/src/settings/plugins/ibft/reader.c @@ -178,6 +178,7 @@ done: if (lines) g_strfreev (lines); g_free (out); + g_free (err); if (success) *out_blocks = blocks; else From 98a0299265647a88cf9d4de6270a2c58456011f0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:27:49 +0100 Subject: [PATCH 15/37] ifcfg-rh: fix memleak in svSetValue() --- src/settings/plugins/ifcfg-rh/shvar.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index 6c9769b2c8..5f3d173b2a 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -372,10 +372,12 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) if (oldval) { /* delete line */ s->lineList = g_list_remove_link (s->lineList, s->current); + g_free (s->current->data); g_list_free_1 (s->current); s->modified = TRUE; } - goto bail; /* do not need keyValue */ + g_free (keyValue); + goto end; } if (!oldval) { @@ -387,21 +389,19 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) if (strcmp (oldval, newval) != 0) { /* change line */ - if (s->current) + if (s->current) { + g_free (s->current->data); s->current->data = keyValue; - else + } else s->lineList = g_list_append (s->lineList, keyValue); s->modified = TRUE; - } + } else + g_free (keyValue); end: g_free (newval); g_free (oldval); return; - - bail: - g_free (keyValue); - goto end; } /* Write the current contents iff modified. Returns FALSE on error From fcfd8f487acf4d6d754af5148408558f783030d3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:59:28 +0100 Subject: [PATCH 16/37] ifcfg-rh: fix memleak due to make_wpa_setting() returning both wsec and error ==10501== 353 (32 direct, 321 indirect) bytes in 1 blocks are definitely lost in loss record 1,579 of 1,641 ==10501== at 0x7EE3728: g_type_create_instance (gtype.c:1847) ==10501== by 0x7EC75B4: g_object_new_internal (gobject.c:1746) ==10501== by 0x7EC945C: g_object_newv (gobject.c:1890) ==10501== by 0x7EC9C23: g_object_new (gobject.c:1556) ==10501== by 0x1CD87C: nm_setting_wireless_security_new (nm-setting-wireless-security.c:122) ==10501== by 0x16F70B: make_wpa_setting (reader.c:3010) ==10501== by 0x16F33F: make_wireless_security_setting (reader.c:3188) ==10501== by 0x161F4C: wireless_connection_from_ifcfg (reader.c:3464) ==10501== by 0x16109A: connection_from_file_full (reader.c:4763) ==10501== by 0x1614EE: connection_from_file_test (reader.c:4862) ==10501== by 0x13D1D6: test_read_wifi_wpa_psk_unquoted2 (test-ifcfg-rh.c:4316) ==10501== by 0x1281FD: main (test-ifcfg-rh.c:12513) ==10501== --- src/settings/plugins/ifcfg-rh/reader.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 1acfbe8eea..5c3c97aeb8 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -3073,7 +3073,8 @@ make_wpa_setting (shvarFile *ifcfg, if (psk) { g_object_set (wsec, NM_SETTING_WIRELESS_SECURITY_PSK, psk, NULL); g_free (psk); - } + } else if (error) + goto error; } if (adhoc) From 53796f0beb19cd6308724861f48276179147920a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:54:01 +0100 Subject: [PATCH 17/37] ifcfg-rh: fix memleaks in reader --- src/settings/plugins/ifcfg-rh/reader.c | 36 ++++++++++---------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 5c3c97aeb8..d13ba3dc4b 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -536,8 +536,6 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * char **lines = NULL, **iter; GRegex *regex_to1, *regex_to2, *regex_via, *regex_metric; GMatchInfo *match_info; - NMIPRoute *route = NULL; - char *dest = NULL, *prefix = NULL, *next_hop = NULL, *metric = NULL; gint64 prefix_int, metric_int; gboolean success = FALSE; @@ -568,6 +566,9 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * /* Iterate through file lines */ lines = g_strsplit_set (contents, "\n\r", -1); for (iter = lines; iter && *iter; iter++) { + gs_free char *next_hop = NULL, *dest = NULL; + char *prefix, *metric; + NMIPRoute *route; /* Skip empty lines */ if (g_regex_match_simple (pattern_empty, *iter, 0, 0)) @@ -587,11 +588,10 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * } dest = g_match_info_fetch (match_info, 1); if (!strcmp (dest, "default")) - strcpy (dest, "0.0.0.0"); + strcpy (dest, "0.0.0.0"); if (!nm_utils_ipaddr_valid (AF_INET, dest)) { g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, "Invalid IP4 route destination address '%s'", dest); - g_free (dest); g_match_info_free (match_info); goto error; } @@ -606,7 +606,6 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * if (errno || prefix_int <= 0 || prefix_int > 32) { g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, "Invalid IP4 route destination prefix '%s'", prefix); - g_free (dest); g_free (prefix); goto error; } @@ -622,13 +621,10 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * "Invalid IP4 route gateway address '%s'", next_hop); g_match_info_free (match_info); - g_free (dest); - g_free (next_hop); goto error; } } else { /* we don't make distinction between missing GATEWAY IP and 0.0.0.0 */ - next_hop = NULL; } g_match_info_free (match_info); @@ -643,8 +639,6 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * g_match_info_free (match_info); g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, "Invalid IP4 route metric '%s'", metric); - g_free (dest); - g_free (next_hop); g_free (metric); goto error; } @@ -653,13 +647,11 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * g_match_info_free (match_info); route = nm_ip_route_new (AF_INET, dest, prefix_int, next_hop, metric_int, error); - if (!route) { - g_free (dest); - g_free (next_hop); + if (!route) goto error; - } if (!nm_setting_ip_config_add_route (s_ip4, route)) PARSE_WARNING ("duplicate IP4 route"); + nm_ip_route_unref (route); } success = TRUE; @@ -667,8 +659,6 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * error: g_free (contents); g_strfreev (lines); - if (route) - nm_ip_route_unref (route); g_regex_unref (regex_to1); g_regex_unref (regex_to2); g_regex_unref (regex_via); @@ -743,7 +733,6 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error char **lines = NULL, **iter; GRegex *regex_to1, *regex_to2, *regex_via, *regex_metric; GMatchInfo *match_info; - NMIPRoute *route = NULL; char *dest = NULL, *prefix = NULL, *next_hop = NULL, *metric = NULL; gint64 prefix_int, metric_int; gboolean success = FALSE; @@ -775,6 +764,7 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error /* Iterate through file lines */ lines = g_strsplit_set (contents, "\n\r", -1); for (iter = lines; iter && *iter; iter++) { + NMIPRoute *route; /* Skip empty lines */ if (g_regex_match_simple (pattern_empty, *iter, 0, 0)) @@ -864,6 +854,7 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error goto error; if (!nm_setting_ip_config_add_route (s_ip6, route)) PARSE_WARNING ("duplicate IP6 route"); + nm_ip_route_unref (route); } success = TRUE; @@ -871,8 +862,6 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error error: g_free (contents); g_strfreev (lines); - if (route) - nm_ip_route_unref (route); g_regex_unref (regex_to1); g_regex_unref (regex_to2); g_regex_unref (regex_via); @@ -4465,6 +4454,7 @@ make_vlan_setting (shvarFile *ifcfg, goto error; } g_object_set (s_vlan, NM_SETTING_VLAN_PARENT, parent, NULL); + g_clear_pointer (&parent, g_free); if (svTrueValue (ifcfg, "REORDER_HDR", FALSE)) vlan_flags |= NM_VLAN_FLAG_REORDER_HEADERS; @@ -4483,6 +4473,8 @@ make_vlan_setting (shvarFile *ifcfg, parse_prio_map_list (s_vlan, ifcfg, "VLAN_INGRESS_PRIORITY_MAP", NM_VLAN_INGRESS_MAP); parse_prio_map_list (s_vlan, ifcfg, "VLAN_EGRESS_PRIORITY_MAP", NM_VLAN_EGRESS_MAP); + g_free (iface_name); + return (NMSetting *) s_vlan; error: @@ -4656,7 +4648,8 @@ connection_from_file_full (const char *filename, { NMConnection *connection = NULL; shvarFile *parsed; - char *type, *devtype, *bootproto; + gs_free char *type = NULL; + char *devtype, *bootproto; NMSetting *s_ip4, *s_ip6, *s_port, *s_dcb = NULL; const char *ifcfg_name = NULL; @@ -4700,8 +4693,6 @@ connection_from_file_full (const char *filename, } g_free (bootproto); - type = NULL; - devtype = svGetValue (parsed, "DEVICETYPE", FALSE); if (devtype) { if (!strcasecmp (devtype, TYPE_TEAM)) @@ -4789,7 +4780,6 @@ connection_from_file_full (const char *filename, PARSE_WARNING ("connection type was unrecognized but device was not uniquely identified; device may be managed"); goto done; } - g_free (type); if (!connection) goto done; From a9bfe9f4bb42682713eedbc2ffb4950e4bd275fe Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:07:26 +0100 Subject: [PATCH 18/37] ifcfg-rh: fix memleak in write_ip4_aliases() and assert against overflow --- src/settings/plugins/ifcfg-rh/writer.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c index 383bee0811..a746b2421c 100644 --- a/src/settings/plugins/ifcfg-rh/writer.c +++ b/src/settings/plugins/ifcfg-rh/writer.c @@ -44,6 +44,7 @@ #include #include "nm-logging.h" +#include "gsystem-local-alloc.h" #include "common.h" #include "shvar.h" #include "reader.h" @@ -2112,13 +2113,16 @@ static void write_ip4_aliases (NMConnection *connection, char *base_ifcfg_path) { NMSettingIPConfig *s_ip4; - char *base_ifcfg_dir, *base_ifcfg_name, *base_name; + gs_free char *base_ifcfg_dir = NULL, *base_ifcfg_name = NULL; + const char*base_name; int i, num, base_ifcfg_name_len, base_name_len; GDir *dir; base_ifcfg_dir = g_path_get_dirname (base_ifcfg_path); base_ifcfg_name = g_path_get_basename (base_ifcfg_path); base_ifcfg_name_len = strlen (base_ifcfg_name); + if (!g_str_has_prefix (base_ifcfg_name, IFCFG_TAG)) + g_return_if_reached (); base_name = base_ifcfg_name + strlen (IFCFG_TAG); base_name_len = strlen (base_name); @@ -2190,9 +2194,6 @@ write_ip4_aliases (NMConnection *connection, char *base_ifcfg_path) svWriteFile (ifcfg, 0644, NULL); svCloseFile (ifcfg); } - - g_free (base_ifcfg_name); - g_free (base_ifcfg_dir); } static gboolean From 1935fca09af9258f84405b64301e7da835df8038 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:03:15 +0100 Subject: [PATCH 19/37] dhcp: fix memleak in process_dhclient_rfc3442_route() --- src/dhcp-manager/nm-dhcp-utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dhcp-manager/nm-dhcp-utils.c b/src/dhcp-manager/nm-dhcp-utils.c index 5aa25ff0c4..8cd4359abb 100644 --- a/src/dhcp-manager/nm-dhcp-utils.c +++ b/src/dhcp-manager/nm-dhcp-utils.c @@ -140,6 +140,7 @@ process_dhclient_rfc3442_route (const char **octets, g_free (str_addr); goto error; } + g_free (str_addr); tmp_addr &= nm_utils_ip4_prefix_to_netmask ((guint32) tmp); route->network = tmp_addr; } From 1680bf3ad1e36c3a6993b2e6ada20363c4195dce Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 12:13:14 +0100 Subject: [PATCH 20/37] core/tests: fix memleak in tests to avoid valgrind warnings --- src/tests/test-wired-defname.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tests/test-wired-defname.c b/src/tests/test-wired-defname.c index a05588b8a4..1d83f3d1aa 100644 --- a/src/tests/test-wired-defname.c +++ b/src/tests/test-wired-defname.c @@ -26,6 +26,7 @@ #include #include #include "nm-device-ethernet-utils.h" +#include "gsystem-local-alloc.h" static NMConnection * _new_connection (const char *id) @@ -45,7 +46,7 @@ _new_connection (const char *id) static void test_defname_no_connections (void) { - char *name; + gs_free char *name; name = nm_device_ethernet_utils_get_default_wired_name (NULL); g_assert_cmpstr (name, ==, "Wired connection 1"); @@ -57,7 +58,7 @@ static void test_defname_no_conflict (void) { GSList *list = NULL; - char *name; + gs_free char *name; list = g_slist_append (list, _new_connection ("asdfasdfasdfadf")); list = g_slist_append (list, _new_connection ("work wifi")); @@ -75,7 +76,7 @@ static void test_defname_conflict (void) { GSList *list = NULL; - char *name; + gs_free char *name; list = g_slist_append (list, _new_connection ("asdfasdfasdfadf")); list = g_slist_append (list, _new_connection ("Wired connection 1")); @@ -93,7 +94,7 @@ static void test_defname_multiple_conflicts (void) { GSList *list = NULL; - char *name; + gs_free char *name; list = g_slist_append (list, _new_connection ("random gsm connection")); list = g_slist_append (list, _new_connection ("home wifi")); From 1ba16f44cfcab869ea1b8d6beb707de7794c5fb6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 5 Feb 2015 11:43:50 +0100 Subject: [PATCH 21/37] callouts/tests: fix memleak in test code for valgrind --- callouts/tests/test-dispatcher-envp.c | 30 ++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/callouts/tests/test-dispatcher-envp.c b/callouts/tests/test-dispatcher-envp.c index eb41505dc0..ac2a9bd900 100644 --- a/callouts/tests/test-dispatcher-envp.c +++ b/callouts/tests/test-dispatcher-envp.c @@ -212,12 +212,12 @@ parse_ip4 (GKeyFile *kf, GVariant **out_props, const char *section, GError **err split = g_strsplit_set (tmp, " ", -1); g_free (tmp); - if (g_strv_length (split) > 0) { + if (split && g_strv_length (split) > 0) { for (iter = split; iter && *iter; iter++) g_strstrip (*iter); g_variant_builder_add (&props, "{sv}", "domains", g_variant_new_strv ((gpointer) split, -1)); - g_strfreev (split); } + g_strfreev (split); /* nameservers */ if (!add_uint_array (kf, &props, "ip4", "nameservers", error)) @@ -233,7 +233,7 @@ parse_ip4 (GKeyFile *kf, GVariant **out_props, const char *section, GError **err split = g_strsplit_set (tmp, ",", -1); g_free (tmp); - if (g_strv_length (split) > 0) { + if (split && g_strv_length (split) > 0) { addresses = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref); for (iter = split; iter && *iter; iter++) { NMIPAddress *addr; @@ -275,7 +275,7 @@ parse_ip4 (GKeyFile *kf, GVariant **out_props, const char *section, GError **err split = g_strsplit_set (tmp, ",", -1); g_free (tmp); - if (g_strv_length (split) > 0) { + if (split && g_strv_length (split) > 0) { routes = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_route_unref); for (iter = split; iter && *iter; iter++) { NMIPRoute *route; @@ -336,11 +336,15 @@ parse_dhcp (GKeyFile *kf, g_variant_builder_init (&props, G_VARIANT_TYPE ("a{sv}")); for (iter = keys; iter && *iter; iter++) { val = g_key_file_get_string (kf, group_name, *iter, error); - if (!val) + if (!val) { + g_strfreev (keys); + g_variant_builder_clear (&props); return FALSE; + } g_variant_builder_add (&props, "{sv}", *iter, g_variant_new_string (val)); g_free (val); } + g_strfreev (keys); *out_props = g_variant_builder_end (&props); return TRUE; @@ -367,6 +371,21 @@ get_dispatcher_file (const char *file, gboolean success = FALSE; char **keys, **iter, *val; + g_assert (!error || !*error); + g_assert (out_con_dict && !*out_con_dict); + g_assert (out_con_props && !*out_con_props); + g_assert (out_device_props && !*out_device_props); + g_assert (out_device_ip4_props && !*out_device_ip4_props); + g_assert (out_device_ip6_props && !*out_device_ip6_props); + g_assert (out_device_dhcp4_props && !*out_device_dhcp4_props); + g_assert (out_device_dhcp6_props && !*out_device_dhcp6_props); + g_assert (out_vpn_ip_iface && !*out_vpn_ip_iface); + g_assert (out_vpn_ip4_props && !*out_vpn_ip4_props); + g_assert (out_vpn_ip6_props && !*out_vpn_ip6_props); + g_assert (out_expected_iface && !*out_expected_iface); + g_assert (out_action && !*out_action); + g_assert (out_env && !*out_env); + kf = g_key_file_new (); if (!g_key_file_load_from_file (kf, file, G_KEY_FILE_NONE, error)) return FALSE; @@ -520,6 +539,7 @@ test_generic (const char *file, const char *override_vpn_ip_iface) g_assert_cmpstr (expected_iface, ==, out_iface); + g_strfreev (denv); g_free (out_iface); g_free (vpn_ip_iface); g_free (expected_iface); From 9a2f2ed7fdd44e670210adffc4ffde6aa5089309 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:25:47 +0100 Subject: [PATCH 22/37] keyfile/tests: fix memleaks in test code for valgrind --- src/settings/plugins/keyfile/tests/test-keyfile.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c index 51f9e2c882..28ab20c681 100644 --- a/src/settings/plugins/keyfile/tests/test-keyfile.c +++ b/src/settings/plugins/keyfile/tests/test-keyfile.c @@ -1515,6 +1515,7 @@ test_write_intlike_ssid (void) g_assert_no_error (error); g_assert (tmp); g_assert_cmpstr (tmp, ==, "101"); + g_free (tmp); g_key_file_free (keyfile); @@ -1601,6 +1602,7 @@ test_write_intlike_ssid_2 (void) g_assert_no_error (error); g_assert (tmp); g_assert_cmpstr (tmp, ==, "11\\;12\\;13\\;"); + g_free (tmp); g_key_file_free (keyfile); @@ -2511,6 +2513,7 @@ test_write_wired_8021x_tls_connection_path (void) tmp2 = g_path_get_dirname (testfile); if (g_strcmp0 (tmp2, TEST_KEYFILES_DIR) == 0) relative = TRUE; + g_free (tmp2); /* CA cert */ tmp = g_key_file_get_string (keyfile, @@ -3098,6 +3101,7 @@ test_write_new_wired_group_name (void) unlink (testfile); g_free (testfile); + g_key_file_unref (kf); g_object_unref (reread); g_object_unref (connection); } @@ -3236,6 +3240,7 @@ test_write_new_wireless_group_names (void) unlink (testfile); g_free (testfile); + g_key_file_unref (kf); g_object_unref (reread); g_object_unref (connection); } From fbe8c0ed87a83e66f27df3cce7110ba23b80875e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:02:36 +0100 Subject: [PATCH 23/37] ibft/tests: fix memleaks in test code for valgrind --- src/settings/plugins/ibft/tests/test-ibft.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/settings/plugins/ibft/tests/test-ibft.c b/src/settings/plugins/ibft/tests/test-ibft.c index 2ff249af34..d5da9ec022 100644 --- a/src/settings/plugins/ibft/tests/test-ibft.c +++ b/src/settings/plugins/ibft/tests/test-ibft.c @@ -63,7 +63,7 @@ read_block (const char *iscsiadm_path, const char *expected_mac) } g_assert (block); - g_slist_foreach (blocks, (GFunc) g_ptr_array_unref, NULL); + g_slist_free_full (blocks, (GDestroyNotify) g_ptr_array_unref); return block; } @@ -110,6 +110,7 @@ test_read_ibft_dhcp (void) g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); g_object_unref (connection); + g_ptr_array_unref (block); } static void @@ -266,7 +267,7 @@ test_read_ibft_vlan (void) g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip4), ==, NULL); g_object_unref (connection); - g_ptr_array_ref (block); + g_ptr_array_unref (block); } NMTST_DEFINE (); From 0750d934bf3eb0834796620ddffed6c5c7f2b9e3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:00:07 +0100 Subject: [PATCH 24/37] ifcfg-rh/tests: fix memleaks in test code for valgrind --- .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index 15cdf88f03..3bc4ba932e 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -377,7 +377,7 @@ test_read_unmanaged_unrecognized (void) { NMConnection *connection; NMSettingConnection *s_con; - char *unhandled_spec = NULL; + gs_free char *unhandled_spec = NULL; GError *error = NULL; const char *expected_id = "PigeonNet"; guint64 expected_timestamp = 0; @@ -408,7 +408,7 @@ test_read_unrecognized (void) { NMConnection *connection; NMSettingConnection *s_con; - char *unhandled_spec = NULL; + gs_free char *unhandled_spec = NULL; GError *error = NULL; const char *expected_id = "U Can't Touch This"; guint64 expected_timestamp = 0; @@ -5341,6 +5341,7 @@ test_read_wifi_band_a_channel_mismatch (void) NULL, TYPE_WIRELESS, NULL, &error); g_assert (connection == NULL); g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); + g_clear_error (&error); } static void @@ -5353,6 +5354,7 @@ test_read_wifi_band_bg_channel_mismatch (void) NULL, TYPE_WIRELESS, NULL, &error); g_assert (connection == NULL); g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); + g_clear_error (&error); } #define TEST_IFCFG_WIRED_QETH_STATIC TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wired-qeth-static" @@ -9523,6 +9525,7 @@ test_write_wifi_wpa_then_wep_with_perms (void) keyfile = utils_get_keys_path (testfile); unlink (keyfile); unlink (testfile); + g_free (keyfile); g_free (testfile); g_object_unref (reread); @@ -10185,6 +10188,7 @@ test_write_wired_pppoe (void) "wired-pppoe-write", "unexpected success writing connection to disk"); g_object_unref (connection); + g_clear_error (&error); } static void @@ -10247,6 +10251,7 @@ test_write_vpn (void) "vpn-write", "unexpected success writing connection to disk"); g_object_unref (connection); + g_clear_error (&error); } static void @@ -10329,6 +10334,7 @@ test_write_mobile_broadband (gboolean gsm) "mobile-broadband-write", "unexpected success writing connection to disk"); g_object_unref (connection); + g_clear_error (&error); } #define TEST_IFCFG_BRIDGE_MAIN TEST_IFCFG_DIR"/network-scripts/ifcfg-test-bridge-main" @@ -10955,6 +10961,7 @@ test_read_ibft_ignored (void) NULL, &error); g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (connection == NULL); + g_clear_error (&error); } #define TEST_IFCFG_BOND_MAIN TEST_IFCFG_DIR"/network-scripts/ifcfg-test-bond-main" @@ -11750,6 +11757,7 @@ test_read_dcb_bad_booleans (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "invalid boolean digit")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11767,6 +11775,7 @@ test_read_dcb_short_booleans (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "boolean array must be 8 characters")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11784,6 +11793,7 @@ test_read_dcb_bad_uints (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "invalid uint digit")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11801,6 +11811,7 @@ test_read_dcb_short_uints (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "uint array must be 8 characters")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11818,6 +11829,7 @@ test_read_dcb_bad_percent (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "invalid percent element")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11835,6 +11847,7 @@ test_read_dcb_short_percent (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "percent array must be 8 elements")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -11852,6 +11865,7 @@ test_read_dcb_pgpct_not_100 (void) g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION); g_assert (strstr (error->message, "invalid percentage sum")); g_assert (connection == NULL); + g_clear_error (&error); } static void @@ -12207,6 +12221,7 @@ test_write_team_port (void) val = svGetValue (f, "TEAM_PORT_CONFIG", TRUE); g_assert (val); g_assert_cmpstr (val, ==, escaped_expected_config); + g_free (val); val = svGetValue (f, "TEAM_MASTER", TRUE); g_assert (val); g_assert_cmpstr (val, ==, "team0"); From ae73320b8c861521cf628828bfbb481999c3d0fc Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 13:31:06 +0100 Subject: [PATCH 25/37] libnm/tests: fix memleaks in tests for valgrind --- include/nm-test-utils.h | 4 ++-- libnm-core/tests/test-crypto.c | 3 ++- libnm-core/tests/test-general.c | 24 ++++++++++++--------- libnm-core/tests/test-secrets.c | 7 ++++++- libnm-core/tests/test-setting-8021x.c | 3 +++ libnm-core/tests/test-setting-dcb.c | 11 +++++----- libnm-util/tests/test-crypto.c | 5 ++++- libnm-util/tests/test-general.c | 30 ++++++++++++++++++--------- libnm-util/tests/test-secrets.c | 14 ++++++++++++- libnm-util/tests/test-setting-8021x.c | 3 +++ libnm-util/tests/test-setting-dcb.c | 11 +++++----- 11 files changed, 79 insertions(+), 36 deletions(-) diff --git a/include/nm-test-utils.h b/include/nm-test-utils.h index a26bffad26..a9347e92ab 100644 --- a/include/nm-test-utils.h +++ b/include/nm-test-utils.h @@ -1054,8 +1054,8 @@ typedef enum { g_variant_builder_add (&__setting_builder, "{sv}", \ __cur_property_name, \ __property_val); \ - } else \ - g_variant_unref (__property_val); \ + } \ + g_variant_unref (__property_val); \ } \ \ if (__cur_setting_name) \ diff --git a/libnm-core/tests/test-crypto.c b/libnm-core/tests/test-crypto.c index 1c8ae4773e..b6ed2b11af 100644 --- a/libnm-core/tests/test-crypto.c +++ b/libnm-core/tests/test-crypto.c @@ -98,7 +98,7 @@ out: static void test_cert (gconstpointer test_data) { - char *path; + gs_free char *path; GByteArray *array; NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; GError *error = NULL; @@ -226,6 +226,7 @@ test_is_pkcs12 (const char *path, gboolean expect_fail) if (expect_fail) { g_assert_error (error, NM_CRYPTO_ERROR, NM_CRYPTO_ERROR_INVALID_DATA); g_assert (!is_pkcs12); + g_clear_error (&error); } else { g_assert_no_error (error); g_assert (is_pkcs12); diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index 04e2a8e654..2a091187a8 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -25,6 +25,7 @@ #include #include +#include "gsystem-local-alloc.h" #include "nm-setting-private.h" #include "nm-utils.h" @@ -648,7 +649,7 @@ test_setting_ip4_config_address_data (void) static void test_setting_gsm_apn_spaces (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; const char *tmp; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); @@ -676,7 +677,7 @@ test_setting_gsm_apn_spaces (void) static void test_setting_gsm_apn_bad_chars (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); ASSERT (s_gsm != NULL, @@ -714,7 +715,7 @@ test_setting_gsm_apn_bad_chars (void) static void test_setting_gsm_apn_underscore (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); g_assert (s_gsm); @@ -729,7 +730,7 @@ test_setting_gsm_apn_underscore (void) static void test_setting_gsm_without_number (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); g_assert (s_gsm); @@ -1551,6 +1552,7 @@ test_connection_replace_settings_bad (void) connection = new_test_connection (); success = nm_connection_replace_settings (connection, new_settings, &error); g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_SETTING); + g_clear_error (&error); g_assert (!success); g_assert (nm_connection_verify (connection, NULL)); @@ -2388,7 +2390,7 @@ test_connection_bad_base_types (void) static void test_setting_compare_id (void) { - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; old = nm_setting_connection_new (); @@ -2412,7 +2414,7 @@ test_setting_compare_id (void) static void test_setting_compare_timestamp (void) { - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; old = nm_setting_connection_new (); @@ -2457,7 +2459,7 @@ static void test_setting_compare_secrets (gconstpointer test_data) { const TestDataCompareSecrets *data = test_data; - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; /* Make sure that a connection with transient/unsaved secrets compares @@ -2488,7 +2490,7 @@ static void test_setting_compare_vpn_secrets (gconstpointer test_data) { const TestDataCompareSecrets *data = test_data; - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; /* Make sure that a connection with transient/unsaved secrets compares @@ -2764,7 +2766,7 @@ test_setting_connection_changed_signal (void) NMConnection *connection; gboolean changed = FALSE; NMSettingConnection *s_con; - char *uuid; + gs_free char *uuid; connection = nm_simple_connection_new (); g_signal_connect (connection, @@ -3170,7 +3172,7 @@ test_setting_802_1x_changed_signal (void) static void test_setting_old_uuid (void) { - NMSetting *setting; + gs_unref_object NMSetting *setting; /* NetworkManager-0.9.4.0 generated 40-character UUIDs with no dashes, * like this one. Test that we maintain compatibility. */ @@ -3879,6 +3881,7 @@ test_setting_ip6_gateway (void) value = g_variant_lookup_value (ip6_dict, NM_SETTING_IP_CONFIG_GATEWAY, G_VARIANT_TYPE_STRING); g_assert (value != NULL); g_assert_cmpstr (g_variant_get_string (value, NULL), ==, "abcd::1"); + g_variant_unref (value); value = g_variant_lookup_value (ip6_dict, NM_SETTING_IP_CONFIG_ADDRESSES, G_VARIANT_TYPE ("a(ayuay)")); g_assert (value != NULL); @@ -3975,6 +3978,7 @@ test_hexstr2bin (void) g_assert (b); g_assert_cmpint (g_bytes_get_size (b), ==, items[i].expected_len); g_assert (memcmp (g_bytes_get_data (b, NULL), items[i].expected, g_bytes_get_size (b)) == 0); + g_bytes_unref (b); } else g_assert (b == NULL); } diff --git a/libnm-core/tests/test-secrets.c b/libnm-core/tests/test-secrets.c index 1254dfffed..a915ae7d4e 100644 --- a/libnm-core/tests/test-secrets.c +++ b/libnm-core/tests/test-secrets.c @@ -176,6 +176,7 @@ test_need_tls_secrets_path (void) "need-tls-secrets-path-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -219,6 +220,7 @@ test_need_tls_secrets_blob (void) "need-tls-secrets-blob-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -345,6 +347,7 @@ test_need_tls_phase2_secrets_path (void) "need-tls-phase2-secrets-path-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -389,6 +392,7 @@ test_need_tls_phase2_secrets_blob (void) "need-tls-phase2-secrets-blob-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -559,8 +563,8 @@ test_update_secrets_wifi_bad_setting_name (void) g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (success == FALSE); + g_clear_error (&error); g_variant_unref (secrets); - g_object_unref (connection); } @@ -668,6 +672,7 @@ test_update_secrets_whole_connection_bad_setting (void) g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (success == FALSE); + g_clear_error (&error); g_variant_unref (copy); g_object_unref (connection); } diff --git a/libnm-core/tests/test-setting-8021x.c b/libnm-core/tests/test-setting-8021x.c index 637ab81c1c..992379c7a2 100644 --- a/libnm-core/tests/test-setting-8021x.c +++ b/libnm-core/tests/test-setting-8021x.c @@ -186,6 +186,7 @@ test_phase2_private_key_import (const char *path, g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL); ASSERT (tmp_key != NULL, "phase2-private-key-import", "missing private key value"); check_scheme_path (tmp_key, path); + g_bytes_unref (tmp_key); } else g_assert_not_reached (); @@ -245,6 +246,7 @@ test_wrong_password_keeps_data (const char *path, const char *password) "wrong-password-keeps-data", "unexpected missing error"); ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, "wrong-password-keeps-data", "unexpected success reading private key format"); + g_clear_error (&error); /* Make sure the password hasn't changed */ pw = nm_setting_802_1x_get_private_key_password (s_8021x); @@ -342,6 +344,7 @@ test_wrong_phase2_password_keeps_data (const char *path, const char *password) "wrong-phase2-password-keeps-data", "unexpected missing error"); ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, "wrong-phase2-password-keeps-data", "unexpected success reading private key format"); + g_clear_error (&error); /* Make sure the password hasn't changed */ pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x); diff --git a/libnm-core/tests/test-setting-dcb.c b/libnm-core/tests/test-setting-dcb.c index 8adab8ce88..2265db8905 100644 --- a/libnm-core/tests/test-setting-dcb.c +++ b/libnm-core/tests/test-setting-dcb.c @@ -28,6 +28,7 @@ #include "nm-setting-dcb.h" #include "nm-connection.h" #include "nm-errors.h" +#include "gsystem-local-alloc.h" #define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ NM_SETTING_DCB_FLAG_ADVERTISE | \ @@ -36,7 +37,7 @@ static void test_dcb_flags_valid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; guint i; @@ -89,7 +90,7 @@ test_dcb_flags_valid (void) static void test_dcb_flags_invalid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; @@ -148,7 +149,7 @@ test_dcb_flags_invalid (void) static void test_dcb_app_priorities (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; @@ -210,7 +211,7 @@ test_dcb_app_priorities (void) static void test_dcb_priorities_valid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; guint i; @@ -269,7 +270,7 @@ test_dcb_priorities_valid (void) static void test_dcb_bandwidth_sums (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; diff --git a/libnm-util/tests/test-crypto.c b/libnm-util/tests/test-crypto.c index 4bf2b3be74..960316d560 100644 --- a/libnm-util/tests/test-crypto.c +++ b/libnm-util/tests/test-crypto.c @@ -96,7 +96,7 @@ out: static void test_cert (gconstpointer test_data) { - char *path; + gs_free char *path; GByteArray *array; NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN; GError *error = NULL; @@ -153,6 +153,7 @@ test_load_private_key (const char *path, "unexpected failure determining private key file '%s' " "type with invalid password (expected %d, got %d)", path, NM_CRYPTO_KEY_TYPE_UNKNOWN, key_type); + g_clear_error (&error); return; } @@ -183,6 +184,7 @@ test_load_private_key (const char *path, g_byte_array_free (decrypted, TRUE); } + g_clear_error (&error); g_byte_array_free (array, TRUE); } @@ -207,6 +209,7 @@ test_load_pkcs12 (const char *path, "%d): %d %s", path, NM_CRYPTO_FILE_FORMAT_PKCS12, format, error->code, error->message); } + g_clear_error (&error); } static void diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c index f748fcf595..52508115fd 100644 --- a/libnm-util/tests/test-general.c +++ b/libnm-util/tests/test-general.c @@ -30,6 +30,7 @@ #include #include +#include "gsystem-local-alloc.h" #include "nm-setting-private.h" #include "nm-setting-connection.h" @@ -310,6 +311,13 @@ test_setting_vpn_modify_during_foreach (void) g_object_unref (s_vpn); } +static void +_g_value_array_free (void *ptr) +{ + if (ptr) + g_value_array_free ((GValueArray *) ptr); +} + #define OLD_DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID)) #define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS)) @@ -338,7 +346,7 @@ test_setting_ip6_config_old_address_array (void) g_value_init (&written_value, OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS); - addresses = g_ptr_array_new (); + addresses = g_ptr_array_new_full (0, _g_value_array_free); array = g_value_array_new (3); /* IP address */ @@ -398,6 +406,7 @@ test_setting_ip6_config_old_address_array (void) ASSERT (memcmp (ba->data, &gw[0], sizeof (gw)) == 0, "ip6-old-addr", "unexpected failure comparing gateways"); + g_ptr_array_unref (addresses); g_value_unset (&written_value); g_value_unset (&read_value); g_object_unref (s_ip6); @@ -406,7 +415,7 @@ test_setting_ip6_config_old_address_array (void) static void test_setting_gsm_apn_spaces (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; const char *tmp; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); @@ -434,7 +443,7 @@ test_setting_gsm_apn_spaces (void) static void test_setting_gsm_apn_bad_chars (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; s_gsm = (NMSettingGsm *) nm_setting_gsm_new (); ASSERT (s_gsm != NULL, @@ -472,7 +481,7 @@ test_setting_gsm_apn_bad_chars (void) static void test_setting_gsm_apn_underscore (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; GError *error = NULL; gboolean success; @@ -491,7 +500,7 @@ test_setting_gsm_apn_underscore (void) static void test_setting_gsm_without_number (void) { - NMSettingGsm *s_gsm; + gs_unref_object NMSettingGsm *s_gsm; GError *error = NULL; gboolean success; @@ -1573,6 +1582,7 @@ test_connection_good_base_types (void) NM_SETTING_GSM_APN, "metered.billing.sucks", NULL); nm_connection_add_setting (connection, setting); + g_clear_object (&connection); /* CDMA connection */ connection = nm_connection_new (); @@ -1671,7 +1681,7 @@ test_connection_bad_base_types (void) static void test_setting_compare_id (void) { - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; old = nm_setting_connection_new (); @@ -1697,7 +1707,7 @@ test_setting_compare_secrets (NMSettingSecretFlags secret_flags, NMSettingCompareFlags comp_flags, gboolean remove_secret) { - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; /* Make sure that a connection with transient/unsaved secrets compares @@ -1729,7 +1739,7 @@ test_setting_compare_vpn_secrets (NMSettingSecretFlags secret_flags, NMSettingCompareFlags comp_flags, gboolean remove_secret) { - NMSetting *old, *new; + gs_unref_object NMSetting *old, *new; gboolean success; /* Make sure that a connection with transient/unsaved secrets compares @@ -1908,7 +1918,7 @@ test_setting_connection_changed_signal (void) NMConnection *connection; gboolean changed = FALSE; NMSettingConnection *s_con; - char *uuid; + gs_free char *uuid; connection = nm_connection_new (); g_signal_connect (connection, @@ -2318,7 +2328,7 @@ static void test_setting_old_uuid (void) { GError *error = NULL; - NMSetting *setting; + gs_unref_object NMSetting *setting; gboolean success; /* NetworkManager-0.9.4.0 generated 40-character UUIDs with no dashes, diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c index 9f0407e4e1..a22edb0fb7 100644 --- a/libnm-util/tests/test-secrets.c +++ b/libnm-util/tests/test-secrets.c @@ -176,6 +176,7 @@ test_need_tls_secrets_path (void) "need-tls-secrets-path-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -219,6 +220,7 @@ test_need_tls_secrets_blob (void) "need-tls-secrets-blob-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -345,6 +347,7 @@ test_need_tls_phase2_secrets_path (void) "need-tls-phase2-secrets-path-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -389,6 +392,7 @@ test_need_tls_phase2_secrets_blob (void) "need-tls-phase2-secrets-blob-key-password", "expected to require private key password, but it wasn't"); + g_ptr_array_free (hints, TRUE); g_object_unref (connection); } @@ -507,6 +511,7 @@ test_update_secrets_wifi_single_setting (void) tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0); g_assert_cmpstr (tmp, ==, wepkey); + g_hash_table_unref (secrets); g_object_unref (connection); } @@ -547,6 +552,7 @@ test_update_secrets_wifi_full_hash (void) tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0); g_assert_cmpstr (tmp, ==, wepkey); + g_hash_table_unref (all); g_object_unref (connection); } @@ -577,6 +583,8 @@ test_update_secrets_wifi_bad_setting_name (void) g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (success == FALSE); + g_clear_error (&error); + g_hash_table_unref (secrets); g_object_unref (connection); } @@ -600,7 +608,7 @@ test_update_secrets_whole_connection (void) secrets = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); wsec_hash = g_hash_table_lookup (secrets, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME); g_assert (wsec_hash); - g_hash_table_insert (wsec_hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey)); + g_hash_table_insert (wsec_hash, g_strdup (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0), string_to_gvalue (wepkey)); success = nm_connection_update_secrets (connection, NULL, secrets, &error); g_assert_no_error (error); @@ -610,6 +618,7 @@ test_update_secrets_whole_connection (void) g_assert (s_wsec); g_assert_cmpstr (nm_setting_wireless_security_get_wep_key (s_wsec, 0), ==, wepkey); + g_hash_table_unref (secrets); g_object_unref (connection); } @@ -629,6 +638,7 @@ test_update_secrets_whole_connection_empty_hash (void) g_assert_no_error (error); g_assert (success == TRUE); g_object_unref (connection); + g_hash_table_unref (secrets); } static void @@ -665,6 +675,7 @@ test_update_secrets_whole_connection_bad_setting (void) g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (success == FALSE); + g_clear_error (&error); g_hash_table_destroy (secrets); g_object_unref (connection); } @@ -718,6 +729,7 @@ test_update_secrets_null_setting_name_with_setting_hash (void) g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_SETTING_NOT_FOUND); g_assert (!success); + g_clear_error (&error); g_hash_table_destroy (secrets); g_object_unref (connection); } diff --git a/libnm-util/tests/test-setting-8021x.c b/libnm-util/tests/test-setting-8021x.c index 4b37d92b78..dfc07a8055 100644 --- a/libnm-util/tests/test-setting-8021x.c +++ b/libnm-util/tests/test-setting-8021x.c @@ -188,6 +188,7 @@ test_phase2_private_key_import (const char *path, g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL); ASSERT (tmp_key != NULL, "phase2-private-key-import", "missing private key value"); check_scheme_path (tmp_key, path); + g_byte_array_free (tmp_key, TRUE); } else g_assert_not_reached (); @@ -249,6 +250,7 @@ test_wrong_password_keeps_data (const char *path, const char *password) "wrong-password-keeps-data", "unexpected missing error"); ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, "wrong-password-keeps-data", "unexpected success reading private key format"); + g_clear_error (&error); /* Make sure the password hasn't changed */ pw = nm_setting_802_1x_get_private_key_password (s_8021x); @@ -346,6 +348,7 @@ test_wrong_phase2_password_keeps_data (const char *path, const char *password) "wrong-phase2-password-keeps-data", "unexpected missing error"); ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN, "wrong-phase2-password-keeps-data", "unexpected success reading private key format"); + g_clear_error (&error); /* Make sure the password hasn't changed */ pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x); diff --git a/libnm-util/tests/test-setting-dcb.c b/libnm-util/tests/test-setting-dcb.c index 1c7d78b8c8..c40ef54ad1 100644 --- a/libnm-util/tests/test-setting-dcb.c +++ b/libnm-util/tests/test-setting-dcb.c @@ -26,6 +26,7 @@ #include #include #include "nm-setting-dcb.h" +#include "gsystem-local-alloc.h" #define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ NM_SETTING_DCB_FLAG_ADVERTISE | \ @@ -34,7 +35,7 @@ static void test_dcb_flags_valid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; guint i; @@ -87,7 +88,7 @@ test_dcb_flags_valid (void) static void test_dcb_flags_invalid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; @@ -146,7 +147,7 @@ test_dcb_flags_invalid (void) static void test_dcb_app_priorities (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; @@ -208,7 +209,7 @@ test_dcb_app_priorities (void) static void test_dcb_priorities_valid (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; guint i; @@ -267,7 +268,7 @@ test_dcb_priorities_valid (void) static void test_dcb_bandwidth_sums (void) { - NMSettingDcb *s_dcb; + gs_unref_object NMSettingDcb *s_dcb; GError *error = NULL; gboolean success; From a82d94a64e9929fb2228de0e27ee3f3efbf82043 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:07:11 +0100 Subject: [PATCH 26/37] device: refactor dispose/cleanup of NMDevice to free members in finalize NMTestDevice does not invoke dispose(), hence it leaks memory which causes false warnings in testing. Some minor refactring to let dispose() clear the fields, but free it later in finalize(). This avoids memleaks in the NMTestDevice stub. --- src/devices/nm-device.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 3bb65c487b..9df3712ed4 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -8323,7 +8323,7 @@ dispose (GObject *object) _cleanup_generic_post (self, FALSE); - g_clear_pointer (&priv->ip6_saved_properties, g_hash_table_unref); + g_hash_table_remove_all (priv->ip6_saved_properties); if (priv->recheck_assume_id) { g_source_remove (priv->recheck_assume_id); @@ -8339,8 +8339,7 @@ dispose (GObject *object) priv->con_provider = NULL; } - g_hash_table_unref (priv->available_connections); - priv->available_connections = NULL; + g_hash_table_remove_all (priv->available_connections); if (priv->carrier_wait_id) { g_source_remove (priv->carrier_wait_id); @@ -8377,6 +8376,9 @@ finalize (GObject *object) g_free (priv->type_desc); g_free (priv->dhcp_anycast_address); + g_hash_table_unref (priv->ip6_saved_properties); + g_hash_table_unref (priv->available_connections); + G_OBJECT_CLASS (nm_device_parent_class)->finalize (object); } From 63f5a22ad709299940c8ecc6ed8c58f58698f19b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:49:29 +0100 Subject: [PATCH 27/37] config/tests: fix memleak in test code for valgrind --- src/tests/config/nm-test-device.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/tests/config/nm-test-device.c b/src/tests/config/nm-test-device.c index 63067b25f6..512085e997 100644 --- a/src/tests/config/nm-test-device.c +++ b/src/tests/config/nm-test-device.c @@ -61,12 +61,6 @@ dispose (GObject *object) g_object_class->dispose (object); } -static void -finalize (GObject *object) -{ - g_object_class->finalize (object); -} - static guint32 get_generic_capabilities (NMDevice *device) { @@ -84,7 +78,6 @@ nm_test_device_class_init (NMTestDeviceClass *klass) object_class->constructor = constructor; object_class->constructed = constructed; object_class->dispose = dispose; - object_class->finalize = finalize; device_class->get_generic_capabilities = get_generic_capabilities; } From d74a3d0a02186eac82f35e8ffe9baf6c3b784cdc Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:06:20 +0100 Subject: [PATCH 28/37] dhcp/tests: fix memleaks in test code for valgrind --- src/dhcp-manager/tests/test-dhcp-dhclient.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dhcp-manager/tests/test-dhcp-dhclient.c b/src/dhcp-manager/tests/test-dhcp-dhclient.c index 4f7e96afde..848584aadf 100644 --- a/src/dhcp-manager/tests/test-dhcp-dhclient.c +++ b/src/dhcp-manager/tests/test-dhcp-dhclient.c @@ -430,6 +430,9 @@ test_one_duid (const char *escaped, const guint8 *unescaped, guint len) g_assert (w); g_assert_cmpint (strlen (escaped), ==, strlen (w)); g_assert_cmpstr (escaped, ==, w); + + g_byte_array_free (t, TRUE); + g_free (w); } static void From 624aa516149d580b071c333e6be3e3455b34938d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:11:14 +0100 Subject: [PATCH 29/37] supplicant/tests: fix memleaks in test code for valgrind --- src/supplicant-manager/tests/test-supplicant-config.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/supplicant-manager/tests/test-supplicant-config.c b/src/supplicant-manager/tests/test-supplicant-config.c index 5aa3fa2db6..9b9e392d25 100644 --- a/src/supplicant-manager/tests/test-supplicant-config.c +++ b/src/supplicant-manager/tests/test-supplicant-config.c @@ -111,7 +111,7 @@ test_wifi_open (void) NMSettingConnection *s_con; NMSettingWireless *s_wifi; NMSettingIPConfig *s_ip4; - NMSupplicantConfig *config; + gs_unref_object NMSupplicantConfig *config; GHashTable *hash; char *uuid; gboolean success; @@ -191,6 +191,7 @@ test_wifi_open (void) validate_opt ("wifi-open", hash, "bssid", TYPE_KEYWORD, bssid_str, -1); validate_opt ("wifi-open", hash, "key_mgmt", TYPE_KEYWORD, "NONE", -1); + g_hash_table_unref (hash); g_object_unref (connection); } @@ -206,7 +207,7 @@ test_wifi_wep_key (const char *detail, NMSettingWireless *s_wifi; NMSettingWirelessSecurity *s_wsec; NMSettingIPConfig *s_ip4; - NMSupplicantConfig *config; + gs_unref_object NMSupplicantConfig *config; GHashTable *hash; char *uuid; gboolean success; @@ -305,6 +306,7 @@ test_wifi_wep_key (const char *detail, validate_opt (detail, hash, "wep_tx_keyidx", TYPE_INT, GINT_TO_POINTER (0), -1); validate_opt (detail, hash, "wep_key0", TYPE_BYTES, expected, expected_size); + g_hash_table_unref (hash); g_object_unref (connection); } @@ -343,7 +345,7 @@ test_wifi_wpa_psk (const char *detail, NMSettingWireless *s_wifi; NMSettingWirelessSecurity *s_wsec; NMSettingIPConfig *s_ip4; - NMSupplicantConfig *config; + gs_unref_object NMSupplicantConfig *config; GHashTable *hash; char *uuid; gboolean success; @@ -454,6 +456,7 @@ test_wifi_wpa_psk (const char *detail, validate_opt (detail, hash, "group", TYPE_KEYWORD, "TKIP CCMP", -1); validate_opt (detail, hash, "psk", key_type, expected, expected_size); + g_hash_table_unref (hash); g_object_unref (connection); } From 171a9eabc6ff54e19df34290fa7975a8030889ab Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 5 Feb 2015 11:02:54 +0100 Subject: [PATCH 30/37] tests: add valgrind suppression for test-general-with-expect ==8781== Syscall param rt_sigaction(act->sa_flags) points to uninitialised byte(s) ==8781== at 0x5E547DD: __libc_sigaction (sigaction.c:64) ==8781== by 0x8149025: unref_unix_signal_handler_unlocked (gmain.c:4981) ==8781== by 0x81490BF: g_child_watch_finalize (gmain.c:5025) ==8781== by 0x8149535: g_source_unref_internal (gmain.c:1997) ==8781== by 0x814C377: g_main_context_dispatch (gmain.c:3094) ==8781== by 0x814C627: g_main_context_iterate.isra.24 (gmain.c:3713) ==8781== by 0x814CA39: g_main_loop_run (gmain.c:3907) ==8781== by 0x11AC8B: test_nm_utils_kill_child_async_do (test-general-with-expect.c:90) ==8781== by 0x119769: test_nm_utils_kill_child (test-general-with-expect.c:292) ==8781== by 0x81705E0: g_test_run_suite_internal (gtestutils.c:2067) ==8781== by 0x81707A5: g_test_run_suite_internal (gtestutils.c:2138) ==8781== by 0x8170B1A: g_test_run_suite (gtestutils.c:2189) ==8781== Address 0xffeffed28 is on thread 1's stack ==8781== { Memcheck:Param rt_sigaction(act->sa_flags) fun:__libc_sigaction fun:unref_unix_signal_handler_unlocked fun:g_child_watch_finalize fun:g_source_unref_internal fun:g_main_context_dispatch fun:g_main_context_iterate.isra.24 fun:g_main_loop_run fun:test_nm_utils_kill_child_async_do fun:test_nm_utils_kill_child fun:g_test_run_suite_internal fun:g_test_run_suite_internal fun:g_test_run_suite } --- valgrind.suppressions | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/valgrind.suppressions b/valgrind.suppressions index c418b4b617..4b58f9af92 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -129,3 +129,19 @@ match-leak-kinds: possible fun:calloc } + + +{ + _glib_sigaction + Memcheck:Param + rt_sigaction(act->sa_flags) + fun:__libc_sigaction + fun:unref_unix_signal_handler_unlocked + fun:g_child_watch_finalize + fun:g_source_unref_internal + fun:g_main_context_dispatch + fun:g_main_context_iterate.isra.24 + fun:g_main_loop_run + ... +} + From d5f83129967b8884f9adf28a8ba71535e81bbb3e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:05:15 +0100 Subject: [PATCH 31/37] tests: add valgrind suppression for callouts tests --- valgrind.suppressions | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/valgrind.suppressions b/valgrind.suppressions index 4b58f9af92..8331cf7c4b 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -145,3 +145,21 @@ ... } +{ + # FIXME: dunny why this is needed. Clean up later. + _dispatcher_test + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_variant_new_from_bytes + fun:g_variant_new_from_trusted + fun:parse_dhcp + fun:get_dispatcher_file + ... + fun:g_test_run_suite_internal + fun:g_test_run_suite_internal + fun:g_test_run_suite +} + From 6853d07f05e5363d8a7881753634764585a63c59 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 11:55:38 +0100 Subject: [PATCH 32/37] platform/tests: reenable valgrind tests valgrind tests for platform were wrongly disabled. Fixes: e3784fa618dff2816a0a793b257d908ef2e99daa --- src/platform/tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/tests/Makefile.am b/src/platform/tests/Makefile.am index b06e25e0ca..c10600eb51 100644 --- a/src/platform/tests/Makefile.am +++ b/src/platform/tests/Makefile.am @@ -109,7 +109,7 @@ test_cleanup_linux_CPPFLAGS = \ -DKERNEL_HACKS=1 test_cleanup_linux_LDADD = $(PLATFORM_LDADD) -#@VALGRIND_RULES@ +@VALGRIND_RULES@ TESTS = test-link-fake test-address-fake test-route-fake test-cleanup-fake test-address-linux test-route-linux test-cleanup-linux From c50f30e79c67593532392f0f251d662e4294f5b2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 11:58:52 +0100 Subject: [PATCH 33/37] tests: enable valgrind tests for tests --- callouts/tests/Makefile.am | 1 + libnm-core/tests/Makefile.am | 1 + libnm-glib/tests/Makefile.am | 1 + libnm-util/tests/Makefile.am | 1 + libnm/tests/Makefile.am | 1 + src/devices/wifi/tests/Makefile.am | 1 + src/dhcp-manager/tests/Makefile.am | 1 + src/dnsmasq-manager/tests/Makefile.am | 1 + src/settings/plugins/ibft/tests/Makefile.am | 1 + src/settings/plugins/ifcfg-rh/tests/Makefile.am | 1 + src/settings/plugins/ifupdown/tests/Makefile.am | 2 ++ src/settings/plugins/keyfile/tests/Makefile.am | 1 + src/supplicant-manager/tests/Makefile.am | 1 + src/tests/Makefile.am | 1 + src/tests/config/Makefile.am | 1 + 15 files changed, 16 insertions(+) diff --git a/callouts/tests/Makefile.am b/callouts/tests/Makefile.am index 3d16d74e25..a0ed40159f 100644 --- a/callouts/tests/Makefile.am +++ b/callouts/tests/Makefile.am @@ -28,6 +28,7 @@ test_dispatcher_envp_LDADD = \ ########################################### +@VALGRIND_RULES@ TESTS = test-dispatcher-envp endif diff --git a/libnm-core/tests/Makefile.am b/libnm-core/tests/Makefile.am index a21c131cb5..79aa73dbf9 100644 --- a/libnm-core/tests/Makefile.am +++ b/libnm-core/tests/Makefile.am @@ -24,6 +24,7 @@ LDADD = \ $(top_builddir)/libnm-core/libnm-core.la \ $(GLIB_LIBS) +@VALGRIND_RULES@ TESTS = $(noinst_PROGRAMS) endif diff --git a/libnm-glib/tests/Makefile.am b/libnm-glib/tests/Makefile.am index 7b8f3627e2..b053109b62 100644 --- a/libnm-glib/tests/Makefile.am +++ b/libnm-glib/tests/Makefile.am @@ -12,6 +12,7 @@ AM_CPPFLAGS = \ noinst_PROGRAMS = $(TESTS) +#@VALGRIND_RULES@ TESTS = test-nm-client test-remote-settings-client ####### NMClient and non-settings tests ####### diff --git a/libnm-util/tests/Makefile.am b/libnm-util/tests/Makefile.am index 690bdbf65a..16a7f8f3fc 100644 --- a/libnm-util/tests/Makefile.am +++ b/libnm-util/tests/Makefile.am @@ -10,6 +10,7 @@ AM_CPPFLAGS = \ -DBUILD_DIR=\"$(abs_builddir)\" \ -DTEST_CERT_DIR=\"$(top_srcdir)/libnm-core/tests/certs/\" +@VALGRIND_RULES@ TESTS = \ test-settings-defaults \ test-crypto \ diff --git a/libnm/tests/Makefile.am b/libnm/tests/Makefile.am index 38449fad07..f16ee3de7e 100644 --- a/libnm/tests/Makefile.am +++ b/libnm/tests/Makefile.am @@ -17,6 +17,7 @@ LDADD = \ noinst_PROGRAMS = $(TESTS) +#@VALGRIND_RULES@ TESTS = test-nm-client test-remote-settings-client test-secret-agent test_nm_client_SOURCES = \ diff --git a/src/devices/wifi/tests/Makefile.am b/src/devices/wifi/tests/Makefile.am index 09c6401fef..2a7d784970 100644 --- a/src/devices/wifi/tests/Makefile.am +++ b/src/devices/wifi/tests/Makefile.am @@ -23,5 +23,6 @@ test_wifi_ap_utils_SOURCES = \ test_wifi_ap_utils_LDADD = $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-wifi-ap-utils diff --git a/src/dhcp-manager/tests/Makefile.am b/src/dhcp-manager/tests/Makefile.am index 9dc5dcb13d..8aa79a29be 100644 --- a/src/dhcp-manager/tests/Makefile.am +++ b/src/dhcp-manager/tests/Makefile.am @@ -37,6 +37,7 @@ test_dhcp_utils_LDADD = \ ################################# +@VALGRIND_RULES@ TESTS = test-dhcp-dhclient test-dhcp-utils EXTRA_DIST = \ diff --git a/src/dnsmasq-manager/tests/Makefile.am b/src/dnsmasq-manager/tests/Makefile.am index c6ce1cdafc..b51de6aa5d 100644 --- a/src/dnsmasq-manager/tests/Makefile.am +++ b/src/dnsmasq-manager/tests/Makefile.am @@ -19,5 +19,6 @@ test_dnsmasq_utils_SOURCES = \ test_dnsmasq_utils_LDADD = \ $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-dnsmasq-utils diff --git a/src/settings/plugins/ibft/tests/Makefile.am b/src/settings/plugins/ibft/tests/Makefile.am index dd72220a76..3c7c94accd 100644 --- a/src/settings/plugins/ibft/tests/Makefile.am +++ b/src/settings/plugins/ibft/tests/Makefile.am @@ -32,6 +32,7 @@ test_ibft_SOURCES = \ test_ibft_LDADD = \ $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-ibft endif diff --git a/src/settings/plugins/ifcfg-rh/tests/Makefile.am b/src/settings/plugins/ifcfg-rh/tests/Makefile.am index 5a17ed9bb6..a3f6a05204 100644 --- a/src/settings/plugins/ifcfg-rh/tests/Makefile.am +++ b/src/settings/plugins/ifcfg-rh/tests/Makefile.am @@ -47,6 +47,7 @@ test_ifcfg_rh_utils_SOURCES = \ test_ifcfg_rh_utils_LDADD = \ $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-ifcfg-rh-utils test-ifcfg-rh endif diff --git a/src/settings/plugins/ifupdown/tests/Makefile.am b/src/settings/plugins/ifupdown/tests/Makefile.am index 24cdd95504..2e927db931 100644 --- a/src/settings/plugins/ifupdown/tests/Makefile.am +++ b/src/settings/plugins/ifupdown/tests/Makefile.am @@ -23,6 +23,8 @@ test_ifupdown_SOURCES = \ test_ifupdown_LDADD = \ $(top_builddir)/src/libNetworkManager.la +# TODO: enable valgrind for ifupdown. Currently it fails. +#@VALGRIND_RULES@ TESTS = test-ifupdown endif diff --git a/src/settings/plugins/keyfile/tests/Makefile.am b/src/settings/plugins/keyfile/tests/Makefile.am index 20b9820c9e..a79e20b5b6 100644 --- a/src/settings/plugins/keyfile/tests/Makefile.am +++ b/src/settings/plugins/keyfile/tests/Makefile.am @@ -34,6 +34,7 @@ test_keyfile_LDADD = \ $(DBUS_LIBS) \ $(CODE_COVERAGE_LDFLAGS) +@VALGRIND_RULES@ TESTS = test-keyfile endif diff --git a/src/supplicant-manager/tests/Makefile.am b/src/supplicant-manager/tests/Makefile.am index 452ccdc1f7..85268dcff9 100644 --- a/src/supplicant-manager/tests/Makefile.am +++ b/src/supplicant-manager/tests/Makefile.am @@ -18,4 +18,5 @@ test_supplicant_config_SOURCES = \ test_supplicant_config_LDADD = \ $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-supplicant-config diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 65bc2199c6..a96d1ce910 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -86,6 +86,7 @@ EXTRA_DIST = test-secret-agent.py ########################################### +@VALGRIND_RULES@ TESTS = \ test-ip4-config \ test-ip6-config \ diff --git a/src/tests/config/Makefile.am b/src/tests/config/Makefile.am index 66009c877b..42c6b9a1b0 100644 --- a/src/tests/config/Makefile.am +++ b/src/tests/config/Makefile.am @@ -23,6 +23,7 @@ test_config_SOURCES = \ test_config_LDADD = \ $(top_builddir)/src/libNetworkManager.la +@VALGRIND_RULES@ TESTS = test-config EXTRA_DIST = \ From 76745817c3e77b7d6c22290a7564b73224147516 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:34:32 +0100 Subject: [PATCH 34/37] libnm/tests: fix memleaks in test code for valgrind --- libnm-glib/tests/test-remote-settings-client.c | 6 +++++- libnm/tests/test-remote-settings-client.c | 6 +++--- libnm/tests/test-secret-agent.c | 10 +++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libnm-glib/tests/test-remote-settings-client.c b/libnm-glib/tests/test-remote-settings-client.c index 237e287f85..a109f8df4a 100644 --- a/libnm-glib/tests/test-remote-settings-client.c +++ b/libnm-glib/tests/test-remote-settings-client.c @@ -36,6 +36,7 @@ #include "nm-remote-settings.h" #include "common.h" +#include "gsystem-local-alloc.h" static NMTestServiceInfo *sinfo; static NMRemoteSettings *settings = NULL; @@ -63,7 +64,7 @@ add_cb (NMRemoteSettings *s, static void test_add_connection (void) { - NMConnection *connection; + gs_unref_object NMConnection *connection = NULL; NMSettingConnection *s_con; NMSettingWired *s_wired; char *uuid; @@ -256,6 +257,7 @@ test_make_visible (void) break; } } + g_slist_free (list); g_assert (found == TRUE); g_free (path); @@ -298,6 +300,7 @@ test_remove_connection (void) g_assert_cmpint (g_slist_length (list), >, 0); connection = NM_REMOTE_CONNECTION (list->data); + g_slist_free (list); g_assert (connection); g_assert (remote == connection); path = g_strdup (nm_connection_get_path (NM_CONNECTION (connection))); @@ -329,6 +332,7 @@ test_remove_connection (void) g_assert ((gpointer) connection != (gpointer) candidate); g_assert_cmpstr (path, ==, nm_connection_get_path (candidate)); } + g_slist_free (list); g_free (path); g_object_unref (proxy); diff --git a/libnm/tests/test-remote-settings-client.c b/libnm/tests/test-remote-settings-client.c index 8f9dc27f2e..15590fac1a 100644 --- a/libnm/tests/test-remote-settings-client.c +++ b/libnm/tests/test-remote-settings-client.c @@ -370,7 +370,7 @@ add_remove_cb (GObject *s, { NMRemoteConnection *connection; gboolean *done = user_data; - GError *error = NULL; + gs_free_error GError *error = NULL; connection = nm_client_add_connection_finish (client, result, &error); g_assert_error (error, NM_CLIENT_ERROR, NM_CLIENT_ERROR_OBJECT_CREATION_FAILED); @@ -426,7 +426,7 @@ add_bad_cb (GObject *s, gpointer user_data) { gboolean *done = user_data; - GError *error = NULL; + gs_free_error GError *error = NULL; remote = nm_client_add_connection_finish (client, result, &error); g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY); @@ -469,7 +469,7 @@ save_hostname_cb (GObject *s, gpointer user_data) { gboolean *done = user_data; - GError *error = NULL; + gs_free_error GError *error = NULL; nm_client_save_hostname_finish (client, result, &error); g_assert_no_error (error); diff --git a/libnm/tests/test-secret-agent.c b/libnm/tests/test-secret-agent.c index 0424b74e9b..dc1b9d6833 100644 --- a/libnm/tests/test-secret-agent.c +++ b/libnm/tests/test-secret-agent.c @@ -354,7 +354,7 @@ connection_activated_none_cb (GObject *c, { TestSecretAgentData *sadata = user_data; NMActiveConnection *ac; - GError *error = NULL; + gs_free_error GError *error = NULL; ac = nm_client_activate_connection_finish (sadata->client, result, &error); g_assert_error (error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_NO_SECRETS); @@ -399,8 +399,8 @@ connection_activated_no_secrets_cb (GObject *c, gpointer user_data) { TestSecretAgentData *sadata = user_data; - NMActiveConnection *ac; - GError *error = NULL; + gs_unref_object NMActiveConnection *ac = NULL; + gs_free_error GError *error = NULL; ac = nm_client_activate_connection_finish (sadata->client, result, &error); g_assert_error (error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_NO_SECRETS); @@ -434,8 +434,8 @@ connection_activated_cancel_cb (GObject *c, gpointer user_data) { TestSecretAgentData *sadata = user_data; - NMActiveConnection *ac; - GError *error = NULL; + gs_unref_object NMActiveConnection *ac; + gs_free_error GError *error = NULL; ac = nm_client_activate_connection_finish (sadata->client, result, &error); g_assert_error (error, NM_AGENT_MANAGER_ERROR, NM_AGENT_MANAGER_ERROR_USER_CANCELED); From bf68917ca309e8d5c0528214913f0c95c34d3c7e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 12:57:20 +0100 Subject: [PATCH 35/37] libnm/tests: add valgrind suppressions --- valgrind.suppressions | 180 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/valgrind.suppressions b/valgrind.suppressions index 8331cf7c4b..f0dbda135d 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -163,3 +163,183 @@ fun:g_test_run_suite } +{ + _gdbus_1 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate.isra.24 + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} + +{ + _gdbus_2 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:g_main_context_push_thread_default + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} + +{ + _gdbus_3 + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:g_malloc0 + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb + fun:g_simple_async_result_complete + fun:complete_in_idle_cb + fun:g_main_context_dispatch + fun:g_main_context_iterate.isra.24 + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy +} + +{ + _gdbus_4 + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:g_malloc0 + fun:thread_memory_from_self.part.12 + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:g_main_context_push_thread_default + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} + +{ + _gdbus_5 + Memcheck:Leak + match-leak-kinds: definite + ... + fun:g_dbus_message_new_from_blob + ... +} + +{ + _gdbus_9 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_current_source + fun:g_task_return + fun:g_task_thread_pool_thread + fun:g_thread_pool_thread_proxy + fun:g_thread_proxy + fun:start_thread + fun:clone +} + +{ + _gdbus_10 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:g_system_thread_new + fun:g_thread_new_internal + fun:g_thread_pool_start_thread.part.0 + fun:g_thread_pool_push + fun:g_task_start_task_thread + fun:g_task_run_in_thread + fun:g_async_initable_real_init_async + fun:g_bus_get +} + +{ + _gdbus_11 + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:g_malloc0 + fun:thread_memory_from_self.part.12 + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_current_source + fun:g_task_return + fun:g_task_thread_pool_thread + fun:g_thread_pool_thread_proxy + fun:g_thread_proxy + fun:start_thread +} + +{ + _gdbus_12 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_error_new_valist + fun:g_error_new + fun:g_dbus_error_new_for_dbus_error + fun:g_dbus_error_set_dbus_error + fun:g_dbus_message_to_gerror + fun:decode_method_reply + fun:g_dbus_connection_call_sync_internal + fun:g_dbus_proxy_call_sync_internal + fun:g_dbus_proxy_call_sync +} + +{ + _gdbus_15 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_hash_table_new_full + fun:demarshal_map + fun:_dbus_gvalue_demarshal + fun:dbus_g_proxy_end_call_internal + fun:dbus_g_proxy_end_call + fun:get_permissions_reply + fun:complete_pending_call_and_unlock + fun:dbus_connection_dispatch + fun:message_queue_dispatch +} + +{ + _gdbus_16 + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:g_malloc0 + fun:_g_dbus_worker_send_message + fun:g_dbus_connection_send_message_unlocked + fun:unsubscribe_id_internal + fun:g_dbus_connection_signal_unsubscribe + fun:g_dbus_proxy_finalize + ... +} + From e7356ef0a6fa94b20850d6f8ca73bfac17589510 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:52:22 +0100 Subject: [PATCH 36/37] libnm/tests: enable valgrind for libnm tests --- configure.ac | 1 + libnm-glib/tests/Makefile.am | 8 +++++--- libnm/tests/Makefile.am | 9 +++++---- tools/run-test-valgrind.sh | 8 ++++++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 3e23728e33..3bace48e27 100644 --- a/configure.ac +++ b/configure.ac @@ -891,6 +891,7 @@ AM_CONDITIONAL(REQUIRE_ROOT_TESTS, test "$enable_tests" == "root") AS_IF([test "$with_valgrind" != "no"], AC_SUBST(VALGRIND_RULES, 'TESTS_ENVIRONMENT = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" "$(top_srcdir)/valgrind.suppressions"'), AC_SUBST(VALGRIND_RULES, [])) +AM_CONDITIONAL(WITH_VALGRIND, test "${with_valgrind}" != "no") GTK_DOC_CHECK(1.0) diff --git a/libnm-glib/tests/Makefile.am b/libnm-glib/tests/Makefile.am index b053109b62..6ce91dd931 100644 --- a/libnm-glib/tests/Makefile.am +++ b/libnm-glib/tests/Makefile.am @@ -12,7 +12,11 @@ AM_CPPFLAGS = \ noinst_PROGRAMS = $(TESTS) -#@VALGRIND_RULES@ +if WITH_VALGRIND +@VALGRIND_RULES@ --launch-dbus +else +TESTS_ENVIRONMENT = $(srcdir)/libnm-test-launch.sh +endif TESTS = test-nm-client test-remote-settings-client ####### NMClient and non-settings tests ####### @@ -43,8 +47,6 @@ test_remote_settings_client_LDADD = \ ########################################### -TESTS_ENVIRONMENT = $(srcdir)/libnm-glib-test-launch.sh - endif EXTRA_DIST = libnm-glib-test-launch.sh diff --git a/libnm/tests/Makefile.am b/libnm/tests/Makefile.am index f16ee3de7e..56dd17d5f8 100644 --- a/libnm/tests/Makefile.am +++ b/libnm/tests/Makefile.am @@ -17,7 +17,11 @@ LDADD = \ noinst_PROGRAMS = $(TESTS) -#@VALGRIND_RULES@ +if WITH_VALGRIND +@VALGRIND_RULES@ --launch-dbus +else +TESTS_ENVIRONMENT = $(srcdir)/libnm-test-launch.sh +endif TESTS = test-nm-client test-remote-settings-client test-secret-agent test_nm_client_SOURCES = \ @@ -34,9 +38,6 @@ test_secret_agent_SOURCES = \ common.c \ common.h \ test-secret-agent.c - -TESTS_ENVIRONMENT = $(srcdir)/libnm-test-launch.sh - endif EXTRA_DIST = libnm-test-launch.sh diff --git a/tools/run-test-valgrind.sh b/tools/run-test-valgrind.sh index 84659fc85b..7eac4a80b7 100755 --- a/tools/run-test-valgrind.sh +++ b/tools/run-test-valgrind.sh @@ -3,6 +3,14 @@ LIBTOOL="$1"; shift VALGRIND="$1"; shift SUPPRESSIONS="$1"; shift +if [ "$1" = "--launch-dbus" ]; then + # Spawn DBus if there's none + if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then + eval `dbus-launch --sh-syntax` + trap "kill $DBUS_SESSION_BUS_PID" EXIT + fi + shift +fi TEST="$1"; shift LOGFILE="valgrind-`echo "$TEST" | tr -cd '[:alpha:]-'`.log" From cfa45600733a91b774d436d66d0e6a446a18834c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 19:28:55 +0100 Subject: [PATCH 37/37] tests: fail valgrind script if log file is non-empty --- tools/run-test-valgrind.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/run-test-valgrind.sh b/tools/run-test-valgrind.sh index 7eac4a80b7..fb8cb1482e 100755 --- a/tools/run-test-valgrind.sh +++ b/tools/run-test-valgrind.sh @@ -27,6 +27,11 @@ $LIBTOOL --mode=execute "$VALGRIND" \ "$TEST" RESULT=$? +if [ $RESULT -eq 0 -a "$(wc -c "$LOGFILE" | awk '{print$1}')" -ne 0 ]; then + echo "valgrind succeeded, but log is not empty: $LOGFILE" + exit 1 +fi + if [ $RESULT -ne 0 -a $RESULT -ne 77 ]; then echo "Don't forget to check the valgrind log at '`realpath $LOGFILE`'." >&2 fi