diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index 22c4194f9..aff631f88 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -1513,13 +1513,14 @@ try_fill_ssid_for_hidden_ap (NMDeviceWifi *self, NMSettingsConnection *sett_conn = connections[i]; NMSettingWireless *s_wifi; + if (!nm_settings_connection_has_seen_bssid (sett_conn, bssid)) + continue; s_wifi = nm_connection_get_setting_wireless (nm_settings_connection_get_connection (sett_conn)); - if (s_wifi) { - if (nm_settings_connection_has_seen_bssid (sett_conn, bssid)) { - nm_wifi_ap_set_ssid (ap, nm_setting_wireless_get_ssid (s_wifi)); - break; - } - } + if (!s_wifi) + continue; + + nm_wifi_ap_set_ssid (ap, nm_setting_wireless_get_ssid (s_wifi)); + break; } } diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 663e63065..5f3f6498a 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -169,6 +169,14 @@ static const NMDBusInterfaceInfoExtended interface_info_settings_connection; /*****************************************************************************/ +static GHashTable * +_seen_bssids_hash_new (void) +{ + return g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, NULL); +} + +/*****************************************************************************/ + NMConnection * nm_settings_connection_get_connection (NMSettingsConnection *self) { @@ -1398,7 +1406,7 @@ get_settings_auth_cb (NMSettingsConnection *self, NMSettingConnection *s_con; NMSettingWireless *s_wifi; guint64 timestamp = 0; - gs_free char **bssids = NULL; + gs_free const char **bssids = NULL; dupl_con = nm_simple_connection_new_clone (nm_settings_connection_get_connection (self)); @@ -1418,9 +1426,11 @@ get_settings_auth_cb (NMSettingsConnection *self, * return settings too. */ bssids = nm_settings_connection_get_seen_bssids (self); - s_wifi = nm_connection_get_setting_wireless (dupl_con); - if (bssids && bssids[0] && s_wifi) - g_object_set (s_wifi, NM_SETTING_WIRELESS_SEEN_BSSIDS, bssids, NULL); + if (bssids) { + s_wifi = nm_connection_get_setting_wireless (dupl_con); + if (s_wifi) + g_object_set (s_wifi, NM_SETTING_WIRELESS_SEEN_BSSIDS, bssids, NULL); + } /* Secrets should *never* be returned by the GetSettings method, they * get returned by the GetSecrets method which can be better @@ -2347,13 +2357,16 @@ nm_settings_connection_register_kf_dbs (NMSettingsConnection *self, tmp_strv = nm_key_file_db_get_string_list (priv->kf_db_seen_bssids, connection_uuid, &len); - if (tmp_strv) { + nm_clear_pointer (&priv->seen_bssids, g_hash_table_unref); + + if (len > 0) { _LOGT ("read %zu seen-bssids from keyfile database \"%s\"", - NM_PTRARRAY_LEN (tmp_strv), + len, nm_key_file_db_get_filename (priv->kf_db_seen_bssids)); - g_hash_table_remove_all (priv->seen_bssids); + priv->seen_bssids = _seen_bssids_hash_new (); for (i = len; i > 0; ) g_hash_table_add (priv->seen_bssids, g_steal_pointer (&tmp_strv[--i])); + nm_clear_g_free (&tmp_strv); } else { NMSettingWireless *s_wifi; @@ -2368,10 +2381,13 @@ nm_settings_connection_register_kf_dbs (NMSettingsConnection *self, s_wifi = nm_connection_get_setting_wireless (nm_settings_connection_get_connection (self)); if (s_wifi) { len = nm_setting_wireless_get_num_seen_bssids (s_wifi); - for (i = 0; i < len; i++) { - const char *bssid = nm_setting_wireless_get_seen_bssid (s_wifi, i); + if (len > 0) { + priv->seen_bssids = _seen_bssids_hash_new (); + for (i = 0; i < len; i++) { + const char *bssid = nm_setting_wireless_get_seen_bssid (s_wifi, i); - g_hash_table_add (priv->seen_bssids, g_strdup (bssid)); + g_hash_table_add (priv->seen_bssids, g_strdup (bssid)); + } } } } @@ -2387,25 +2403,14 @@ nm_settings_connection_register_kf_dbs (NMSettingsConnection *self, * Returns: (transfer container) list of seen BSSIDs (in the standard hex-digits-and-colons notation). * The caller is responsible for freeing the list, but not the content. **/ -char ** +const char ** nm_settings_connection_get_seen_bssids (NMSettingsConnection *self) { - NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self); - GHashTableIter iter; - char **bssids, *bssid; - int i; - g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (self), NULL); - bssids = g_new (char *, g_hash_table_size (priv->seen_bssids) + 1); - - i = 0; - g_hash_table_iter_init (&iter, priv->seen_bssids); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &bssid)) - bssids[i++] = bssid; - bssids[i] = NULL; - - return bssids; + return nm_utils_strdict_get_keys (NM_SETTINGS_CONNECTION_GET_PRIVATE (self)->seen_bssids, + TRUE, + NULL); } /** @@ -2419,10 +2424,15 @@ gboolean nm_settings_connection_has_seen_bssid (NMSettingsConnection *self, const char *bssid) { - g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (self), FALSE); - g_return_val_if_fail (bssid != NULL, FALSE); + NMSettingsConnectionPrivate *priv; - return !!g_hash_table_lookup (NM_SETTINGS_CONNECTION_GET_PRIVATE (self)->seen_bssids, bssid); + g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (self), FALSE); + g_return_val_if_fail (bssid, FALSE); + + priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self); + + return priv->seen_bssids + && g_hash_table_contains (NM_SETTINGS_CONNECTION_GET_PRIVATE (self)->seen_bssids, bssid); } /** @@ -2443,6 +2453,9 @@ nm_settings_connection_add_seen_bssid (NMSettingsConnection *self, g_return_if_fail (seen_bssid != NULL); + if (!priv->seen_bssids) + priv->seen_bssids = _seen_bssids_hash_new (); + g_hash_table_add (priv->seen_bssids, g_strdup (seen_bssid)); if (!priv->kf_db_seen_bssids) @@ -2718,8 +2731,6 @@ nm_settings_connection_init (NMSettingsConnection *self) priv->agent_mgr = g_object_ref (nm_agent_manager_get ()); - priv->seen_bssids = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, NULL); - priv->autoconnect_retries = AUTOCONNECT_RETRIES_UNSET; priv->connection = nm_simple_connection_new (); diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h index ebed798c3..38e34d8fa 100644 --- a/src/settings/nm-settings-connection.h +++ b/src/settings/nm-settings-connection.h @@ -228,7 +228,7 @@ gboolean nm_settings_connection_get_timestamp (NMSettingsConnection *self, void nm_settings_connection_update_timestamp (NMSettingsConnection *self, guint64 timestamp); -char **nm_settings_connection_get_seen_bssids (NMSettingsConnection *self); +const char **nm_settings_connection_get_seen_bssids (NMSettingsConnection *self); gboolean nm_settings_connection_has_seen_bssid (NMSettingsConnection *self, const char *bssid);