diff --git a/src/NetworkManagerAPList.c b/src/NetworkManagerAPList.c index bb4f0f198..db6c1eb5d 100644 --- a/src/NetworkManagerAPList.c +++ b/src/NetworkManagerAPList.c @@ -174,7 +174,7 @@ nm_ap_list_remove_ap_by_ssid (NMAccessPointList *list, const GByteArray * ssid) for (elt = list->ap_list; elt; elt = g_slist_next (elt)) { NMAccessPoint * list_ap = (NMAccessPoint *) elt->data; - if (nm_utils_same_ssid (nm_ap_get_ssid (list_ap), ssid)) { + if (nm_utils_same_ssid (nm_ap_get_ssid (list_ap), ssid, TRUE)) { list->ap_list = g_slist_remove_link (list->ap_list, elt); g_object_unref (list_ap); g_slist_free (elt); @@ -209,7 +209,7 @@ void nm_ap_list_remove_duplicate_ssids (NMAccessPointList *list) NMAccessPoint * list_ap_j = (NMAccessPoint *) elt_j->data; const GByteArray * list_ap_j_ssid = nm_ap_get_ssid (list_ap_j); - if ((found = nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid))) + if ((found = nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid, TRUE))) break; } @@ -225,7 +225,7 @@ void nm_ap_list_remove_duplicate_ssids (NMAccessPointList *list) const GByteArray * list_ap_j_ssid = nm_ap_get_ssid (list_ap_j); strengthj = nm_ap_get_strength (list_ap_j); - if (nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid)) { + if (nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid, TRUE)) { if (strengthj > max_strength) { removal_list = g_slist_append (removal_list, list_ap_max); list_ap_max = list_ap_j; @@ -267,7 +267,7 @@ nm_ap_list_get_ap_by_ssid (NMAccessPointList *list, const GByteArray * ssid) while ((ap = nm_ap_list_iter_next (iter))) { const GByteArray * ap_ssid = nm_ap_get_ssid (ap); - if (ap_ssid && nm_utils_same_ssid (ap_ssid, ssid)) { + if (ap_ssid && nm_utils_same_ssid (ap_ssid, ssid, TRUE)) { found_ap = ap; break; } diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index 2912fdbcb..15b980e91 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -322,7 +322,7 @@ nm_policy_device_change_check (gpointer user_data) * link to the old access point. We don't switch away * from Ad-Hoc APs either. */ - gboolean same_ssid = nm_utils_same_ssid (old_ssid, new_ssid); + gboolean same_ssid = nm_utils_same_ssid (old_ssid, new_ssid, TRUE); /* If the "best" AP's SSID is the same as the current activation * request's SSID, but the current activation request isn't diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index de8e9346c..6aee689ff 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -625,14 +625,28 @@ nm_utils_escape_ssid (const char * ssid, guint32 len) } gboolean -nm_utils_same_ssid (const GByteArray * ssid1, const GByteArray * ssid2) +nm_utils_same_ssid (const GByteArray * ssid1, + const GByteArray * ssid2, + gboolean ignore_trailing_null) { + guint32 ssid1_len, ssid2_len; + if (ssid1 == ssid2) return TRUE; if ((ssid1 && !ssid2) || (!ssid1 && ssid2)) return FALSE; - if (ssid1->len != ssid2->len) + + ssid1_len = ssid1->len; + ssid2_len = ssid2->len; + if (ssid1_len && ssid2_len && ignore_trailing_null) { + if (ssid1->data[ssid1_len - 1] == '\0') + ssid1_len--; + if (ssid2->data[ssid2_len - 1] == '\0') + ssid2_len--; + } + + if (ssid1_len != ssid2_len) return FALSE; - return memcmp (ssid1->data, ssid2->data, ssid1->len) == 0 ? TRUE : FALSE; + return memcmp (ssid1->data, ssid2->data, ssid1_len) == 0 ? TRUE : FALSE; } diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 64b78c49e..e2f7c83dc 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -109,6 +109,8 @@ int nm_utils_ip4_netmask_to_prefix (guint32 ip4_netmask); gboolean nm_utils_is_empty_ssid (const char * ssid, int len); const char * nm_utils_escape_ssid (const char *ssid, guint32 len); -gboolean nm_utils_same_ssid (const GByteArray * ssid1, const GByteArray * ssid2); +gboolean nm_utils_same_ssid (const GByteArray * ssid1, + const GByteArray * ssid2, + gboolean ignore_trailing_null); #endif diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c index 57a4a00a0..8e71cfbb8 100644 --- a/src/nm-device-802-11-wireless.c +++ b/src/nm-device-802-11-wireless.c @@ -224,7 +224,7 @@ nm_device_802_11_wireless_update_bssid (NMDevice80211Wireless *self, if ( nm_ethernet_address_is_valid (&new_bssid) && nm_ethernet_address_is_valid (old_bssid) && !nm_ethernet_addresses_are_equal (&new_bssid, old_bssid) - && nm_utils_same_ssid (old_ssid, new_ssid)) + && nm_utils_same_ssid (old_ssid, new_ssid, TRUE)) { gboolean automatic; gchar new_addr[20]; @@ -729,7 +729,7 @@ link_to_specific_ap (NMDevice80211Wireless *self, const GByteArray * dev_ssid = nm_device_802_11_wireless_get_ssid (self); const GByteArray * ap_ssid = nm_ap_get_ssid (ap); - if (dev_ssid && ap_ssid && nm_utils_same_ssid (dev_ssid, ap_ssid)) { + if (dev_ssid && ap_ssid && nm_utils_same_ssid (dev_ssid, ap_ssid, TRUE)) { self->priv->failed_link_count = 0; have_link = TRUE; } @@ -1936,7 +1936,7 @@ merge_scanned_ap (NMDevice80211Wireless *dev, /* Did the AP's name change? */ if ( !devlist_ssid || !merge_ssid - || !nm_utils_same_ssid (devlist_ssid, merge_ssid)) { + || !nm_utils_same_ssid (devlist_ssid, merge_ssid, TRUE)) { network_removed (dev, list_ap); nm_ap_set_ssid (list_ap, merge_ssid); network_added (dev, list_ap); @@ -2011,7 +2011,7 @@ cull_scan_list (NMDevice80211Wireless * self) /* Don't ever prune the AP we're currently associated with */ ssid = nm_ap_get_ssid (outdated_ap); cur_ssid = cur_ap ? nm_ap_get_ssid (cur_ap) : NULL; - if (ssid && nm_utils_same_ssid (cur_ssid, ssid)) + if (ssid && nm_utils_same_ssid (cur_ssid, ssid, TRUE)) keep_around = TRUE; prune_interval_s = SCAN_INTERVAL_MAX * 3;