From ce7bdc0ac523e29b9acf73f579b9a6bd01a9dcd5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:28:18 +0100 Subject: [PATCH 01/36] cli: fix memleak in nmc_setting_get_valid_properties() (cherry picked from commit fdd09340ce85ab4258fcf4d1d52abcf4dd0be8c5) --- clients/cli/settings.c | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 8df57fb6ee..55c2d6aac2 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -6488,6 +6488,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 f5f3ac65372ce1001248f767fc41d7f8a28a5b75 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 13:53:16 +0100 Subject: [PATCH 02/36] libnm: fix memleak for app_fcoe_mode in NMSettingDcb (cherry picked from commit 052198f4b92f7c218c29304f7d2de4f0150728fb) --- 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 88855bbbeb31a6db3bd9d8fb48d755d6c9bf050d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:21:30 +0100 Subject: [PATCH 03/36] libnm: fix memleak for config in NMSettingTeamPort (cherry picked from commit 8cb6d70e5b91170c7b89ede53078025be959a9f2) --- 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 ec07ac40aa3edce677e5db25960575ea9f05ca9d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 15:22:37 +0100 Subject: [PATCH 04/36] libnm: fix memleak in nm_utils_ip_addresses_from_variant() (cherry picked from commit 66be46309ac6db6afda4412038bfc1130aba51ec) --- 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 f601480b26..b73af8654f 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 727edf43f639d00073f351222e9fabef5717df4d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 15:46:09 +0100 Subject: [PATCH 05/36] libnm: fix memleak in nm_connection_replace_settings() (cherry picked from commit fffd93b5c49ccf4d0a13df73d54c7a0152456436) --- 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 1784de7b35011d1c6b5cfa6184002ffc8419795c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 16:36:55 +0100 Subject: [PATCH 06/36] libnm: fix memleak in find_virtual_interface_name() (cherry picked from commit f1bfe459eef14fa4d9e71d400362bdcc06a38bdc) --- 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 44df4f213f1b730bad13730b10b9d4ba810000f5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:52:43 +0100 Subject: [PATCH 07/36] 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. (cherry picked from commit 7a82d64e475fd346638707af76e9f1f63fec204c) --- 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 590334754d66790c356da499630776bfc3e556d3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 11:31:29 +0100 Subject: [PATCH 08/36] libnm: fix memleaks in nm_setting_802_1x (cherry picked from commit 137e496ef1a24d3da59e2188a5a8bb08a45bc49a) --- 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 5ab76d006e5cf5c3c2ca289721601144bdf5a214 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:30:54 +0100 Subject: [PATCH 09/36] libnm: fix memleak in _nm_dbus_bind_properties() (cherry picked from commit 1567a9f7125f0384226bced6ae8c92346251439c) --- 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 63a23439ee4cf961882c3e9ca942bf1413bb1fd5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:09:48 +0100 Subject: [PATCH 10/36] 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. (cherry picked from commit 027ab3efaa4c3e0de12f921df6854373910b06e7) --- 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 74d44dd56347d0e13faacb4a07d33b315593ef85 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:04:06 +0100 Subject: [PATCH 11/36] config: fix memleak in read_config() (cherry picked from commit b49fdae59eb443632503ed6dc589df27cd2de0c1) Conflicts: src/nm-config.c --- 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 fa9a894429..d072fe0a8d 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -407,8 +407,8 @@ read_config (NMConfig *config, 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 (priv->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 (priv->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); @@ -419,6 +419,8 @@ read_config (NMConfig *config, const char *path, GError **error) g_key_file_set_value (priv->keyfile, groups[g], base_key, new_val); g_free (base_key); + g_free (old_val); + g_free (new_val); continue; } From 410a22b28fa653e23dcd598b1d2c8650efff0834 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:22:06 +0100 Subject: [PATCH 12/36] keyfile: fix memleak in parity_parser() (cherry picked from commit 9d8f93384a017e330261b3cafaf00422e09c7c38) --- 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 1d2ecdad9b..1f0953e058 100644 --- a/src/settings/plugins/keyfile/reader.c +++ b/src/settings/plugins/keyfile/reader.c @@ -870,6 +870,7 @@ parity_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const cha int_val = 'X'; } } + g_free (str_val); } if (!int_val) From 3e1055d1414a53a3ff78cf17311627063b5cd871 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:00:45 +0100 Subject: [PATCH 13/36] ibft: fix memleak in read_ibft_blocks() (cherry picked from commit 494c5c395da5a358f16f5960c9de7b08aac17d01) --- 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 066a79f25e..e89d9b084d 100644 --- a/src/settings/plugins/ibft/reader.c +++ b/src/settings/plugins/ibft/reader.c @@ -186,6 +186,7 @@ done: if (lines) g_strfreev (lines); g_free (out); + g_free (err); if (success) *out_blocks = blocks; else From 2ceea73dc38fb421894344104a0a56d55d9df3be Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:27:49 +0100 Subject: [PATCH 14/36] ifcfg-rh: fix memleak in svSetValue() (cherry picked from commit 98a0299265647a88cf9d4de6270a2c58456011f0) --- 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 856962cea86e813396b9cd92f0f43981d772f442 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:59:28 +0100 Subject: [PATCH 15/36] 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== (cherry picked from commit fcfd8f487acf4d6d754af5148408558f783030d3) --- 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 c7a916efd7..a04e29a96c 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -3080,7 +3080,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 273576b01cc3507300a751a60ef362018178864a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:54:01 +0100 Subject: [PATCH 16/36] ifcfg-rh: fix memleaks in reader (cherry picked from commit 53796f0beb19cd6308724861f48276179147920a) --- 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 a04e29a96c..41439f6159 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -540,8 +540,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; @@ -573,6 +571,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)) @@ -592,11 +593,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; } @@ -611,7 +611,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; } @@ -627,13 +626,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); @@ -648,8 +644,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; } @@ -658,13 +652,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; @@ -672,8 +664,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); @@ -749,7 +739,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; @@ -782,6 +771,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)) @@ -871,6 +861,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; @@ -878,8 +869,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); @@ -4467,6 +4456,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; @@ -4485,6 +4475,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: @@ -4658,7 +4650,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; @@ -4702,8 +4695,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)) @@ -4791,7 +4782,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 825eb5cb62531697fa8f51084664561ea1e88e38 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:07:26 +0100 Subject: [PATCH 17/36] ifcfg-rh: fix memleak in write_ip4_aliases() and assert against overflow (cherry picked from commit a9bfe9f4bb42682713eedbc2ffb4950e4bd275fe) --- 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 86b56cce47..236bc540c8 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" @@ -2111,13 +2112,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); @@ -2189,9 +2193,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 84ff53ec76e6d7a33ee435f87a110f0d1f6f281f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:03:15 +0100 Subject: [PATCH 18/36] dhcp: fix memleak in process_dhclient_rfc3442_route() (cherry picked from commit 1935fca09af9258f84405b64301e7da835df8038) --- 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 b352d0a26b91b487aabf65c349309b7ab67780bb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 12:13:14 +0100 Subject: [PATCH 19/36] core/tests: fix memleak in tests to avoid valgrind warnings (cherry picked from commit 1680bf3ad1e36c3a6993b2e6ada20363c4195dce) --- 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 ac8ea4f7991305ae0d68ee0b970ec0d469cbca57 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 5 Feb 2015 11:43:50 +0100 Subject: [PATCH 20/36] callouts/tests: fix memleak in test code for valgrind (cherry picked from commit 1ba16f44cfcab869ea1b8d6beb707de7794c5fb6) --- 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 b44714f70e..86c430e5ec 100644 --- a/callouts/tests/test-dispatcher-envp.c +++ b/callouts/tests/test-dispatcher-envp.c @@ -204,12 +204,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)) @@ -225,7 +225,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; @@ -267,7 +267,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; @@ -328,11 +328,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; @@ -359,6 +363,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; @@ -512,6 +531,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 f334c4a7f147f56cb493d79871987b835b2c5246 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 15:25:47 +0100 Subject: [PATCH 21/36] keyfile/tests: fix memleaks in test code for valgrind (cherry picked from commit 9a2f2ed7fdd44e670210adffc4ffde6aa5089309) --- 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 8afd9ac5f2..3026593bfa 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, @@ -3115,6 +3118,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); } @@ -3253,6 +3257,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 72666156e37de004c15489065e24e4ebf229bd13 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:02:36 +0100 Subject: [PATCH 22/36] ibft/tests: fix memleaks in test code for valgrind (cherry picked from commit fbe8c0ed87a83e66f27df3cce7110ba23b80875e) --- 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 e25d06cf71e9dcab1415dec3467636157a96cc55 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 17:00:07 +0100 Subject: [PATCH 23/36] ifcfg-rh/tests: fix memleaks in test code for valgrind (cherry picked from commit 0750d934bf3eb0834796620ddffed6c5c7f2b9e3) --- .../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 bdf39537dd..2e59f59315 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" @@ -9528,6 +9530,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); @@ -10198,6 +10201,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 @@ -10260,6 +10264,7 @@ test_write_vpn (void) "vpn-write", "unexpected success writing connection to disk"); g_object_unref (connection); + g_clear_error (&error); } static void @@ -10342,6 +10347,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" @@ -10970,6 +10976,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" @@ -11769,6 +11776,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 @@ -11786,6 +11794,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 @@ -11803,6 +11812,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 @@ -11820,6 +11830,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 @@ -11837,6 +11848,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 @@ -11854,6 +11866,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 @@ -11871,6 +11884,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 @@ -12226,6 +12240,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 2eb71b62297ff3a2a2a8ac977f8b0caa950bc3e7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 6 Feb 2015 13:31:06 +0100 Subject: [PATCH 24/36] libnm/tests: fix memleaks in tests for valgrind (cherry picked from commit ae73320b8c861521cf628828bfbb481999c3d0fc) --- 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 7707e5e94b..64587f8d65 100644 --- a/include/nm-test-utils.h +++ b/include/nm-test-utils.h @@ -1065,8 +1065,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 a369923d03dd71e7e92a47e8d9b61aa0696ddebd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:07:11 +0100 Subject: [PATCH 25/36] 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. (cherry picked from commit a82d94a64e9929fb2228de0e27ee3f3efbf82043) --- 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 884e81420b..d7c830f038 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -8356,7 +8356,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); @@ -8372,8 +8372,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); @@ -8410,6 +8409,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 4f685b4310fb5b7c122114f22125b5b7eb98a592 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 10:49:29 +0100 Subject: [PATCH 26/36] config/tests: fix memleak in test code for valgrind (cherry picked from commit 63f5a22ad709299940c8ecc6ed8c58f58698f19b) --- 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 12ee98f471af9af6e00e4dc60db586ff2023714b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:06:20 +0100 Subject: [PATCH 27/36] dhcp/tests: fix memleaks in test code for valgrind (cherry picked from commit d74a3d0a02186eac82f35e8ffe9baf6c3b784cdc) --- 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 6c527c9393..e1a96cabf2 100644 --- a/src/dhcp-manager/tests/test-dhcp-dhclient.c +++ b/src/dhcp-manager/tests/test-dhcp-dhclient.c @@ -482,6 +482,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 692619ea89927e3eb1b9107ed07da86736c2d58d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:11:14 +0100 Subject: [PATCH 28/36] supplicant/tests: fix memleaks in test code for valgrind (cherry picked from commit 624aa516149d580b071c333e6be3e3455b34938d) --- 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 eab46bce70c8dd02d191d1031e4bf5d391952d1c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 5 Feb 2015 11:02:54 +0100 Subject: [PATCH 29/36] 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 } (cherry picked from commit 171a9eabc6ff54e19df34290fa7975a8030889ab) --- 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 e92ba835ad9622f8ac09b6edbcf72ea31dc07932 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 7 Feb 2015 16:05:15 +0100 Subject: [PATCH 30/36] tests: add valgrind suppression for callouts tests (cherry picked from commit d5f83129967b8884f9adf28a8ba71535e81bbb3e) --- 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 c2cd7e631ff2890df31376e3d48ace93654cd582 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 11:55:38 +0100 Subject: [PATCH 31/36] platform/tests: reenable valgrind tests valgrind tests for platform were wrongly disabled. Fixes: e3784fa618dff2816a0a793b257d908ef2e99daa (cherry picked from commit 6853d07f05e5363d8a7881753634764585a63c59) --- 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 b9a8f3c0594675051745c97f30ad43f6f9ff4d97 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 4 Feb 2015 11:58:52 +0100 Subject: [PATCH 32/36] tests: enable valgrind tests for tests (cherry picked from commit c50f30e79c67593532392f0f251d662e4294f5b2) --- 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 f8fd82b7ea..2605e109e5 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 26f96871a1bf5861b212bdfa49866f18b700fb8b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 13:34:32 +0100 Subject: [PATCH 33/36] libnm/tests: fix memleaks in test code for valgrind (cherry picked from commit 76745817c3e77b7d6c22290a7564b73224147516) --- 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 ab09532c6b71896fdbdac4f7043b79aec1617a71 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 12:57:20 +0100 Subject: [PATCH 34/36] libnm/tests: add valgrind suppressions (cherry picked from commit bf68917ca309e8d5c0528214913f0c95c34d3c7e) --- 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 26406d08685381c656885ad9b57eadf7e0377d99 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 11:52:22 +0100 Subject: [PATCH 35/36] libnm/tests: enable valgrind for libnm tests (cherry picked from commit e7356ef0a6fa94b20850d6f8ca73bfac17589510) --- 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 b3413bf4e1..bc51e12ad0 100644 --- a/configure.ac +++ b/configure.ac @@ -855,6 +855,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 fed9958ae4afc9a29bb39fd13b7cbab18baa6e71 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 8 Feb 2015 19:28:55 +0100 Subject: [PATCH 36/36] tests: fail valgrind script if log file is non-empty (cherry picked from commit cfa45600733a91b774d436d66d0e6a446a18834c) --- 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