diff options
author | Dan Winship <danw@gnome.org> | 2014-10-28 08:56:07 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-10-28 08:57:09 -0400 |
commit | 0cd3fb94a1502f9409d446c6c7472d431ab9b8c6 (patch) | |
tree | f9e28ce64cec3f91de182e5b8d2d3240da44e29c | |
parent | bd191033e613809eacfc23a40064a72e026ef9cd (diff) | |
download | NetworkManager-danw/libnm-ptrarray.tar.gz |
libnm-core: canonicalize hardware addresses in settingsdanw/libnm-ptrarray
Convert hardware addresses to canonical form (uppercase, leading
zeros, colons) when setting them on/adding them to NMSetting
properties.
-rw-r--r-- | libnm-core/nm-setting-bridge.c | 3 | ||||
-rw-r--r-- | libnm-core/nm-setting-infiniband.c | 3 | ||||
-rw-r--r-- | libnm-core/nm-setting-wimax.c | 3 | ||||
-rw-r--r-- | libnm-core/nm-setting-wired.c | 35 | ||||
-rw-r--r-- | libnm-core/nm-setting-wireless.c | 35 | ||||
-rw-r--r-- | libnm-core/nm-utils-private.h | 2 | ||||
-rw-r--r-- | libnm-core/nm-utils.c | 20 |
7 files changed, 68 insertions, 33 deletions
diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c index a5bae95aa7..100804a017 100644 --- a/libnm-core/nm-setting-bridge.c +++ b/libnm-core/nm-setting-bridge.c @@ -278,7 +278,8 @@ set_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_MAC_ADDRESS: g_free (priv->mac_address); - priv->mac_address = g_value_dup_string (value); + priv->mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; case PROP_STP: priv->stp = g_value_get_boolean (value); diff --git a/libnm-core/nm-setting-infiniband.c b/libnm-core/nm-setting-infiniband.c index 1aa43beb27..ed80a13609 100644 --- a/libnm-core/nm-setting-infiniband.c +++ b/libnm-core/nm-setting-infiniband.c @@ -318,7 +318,8 @@ set_property (GObject *object, guint prop_id, switch (prop_id) { case PROP_MAC_ADDRESS: g_free (priv->mac_address); - priv->mac_address = g_value_dup_string (value); + priv->mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + INFINIBAND_ALEN); break; case PROP_MTU: priv->mtu = g_value_get_uint (value); diff --git a/libnm-core/nm-setting-wimax.c b/libnm-core/nm-setting-wimax.c index 5d65c30171..ccc46fe4ef 100644 --- a/libnm-core/nm-setting-wimax.c +++ b/libnm-core/nm-setting-wimax.c @@ -167,7 +167,8 @@ set_property (GObject *object, guint prop_id, break; case PROP_MAC_ADDRESS: g_free (priv->mac_address); - priv->mac_address = g_value_dup_string (value); + priv->mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/libnm-core/nm-setting-wired.c b/libnm-core/nm-setting-wired.c index e172fa6657..7bf1ae2f26 100644 --- a/libnm-core/nm-setting-wired.c +++ b/libnm-core/nm-setting-wired.c @@ -247,6 +247,7 @@ gboolean nm_setting_wired_add_mac_blacklist_item (NMSettingWired *setting, const char *mac) { NMSettingWiredPrivate *priv; + const char *candidate; int i; g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); @@ -257,11 +258,12 @@ nm_setting_wired_add_mac_blacklist_item (NMSettingWired *setting, const char *ma priv = NM_SETTING_WIRED_GET_PRIVATE (setting); for (i = 0; i < priv->mac_address_blacklist->len; i++) { - if (!strcasecmp (mac, g_array_index (priv->mac_address_blacklist, char *, i))) + candidate = g_array_index (priv->mac_address_blacklist, char *, i); + if (nm_utils_hwaddr_matches (mac, -1, candidate, -1)) return FALSE; } - mac = g_ascii_strup (mac, -1); + mac = nm_utils_hwaddr_canonical (mac, ETH_ALEN); g_array_append_val (priv->mac_address_blacklist, mac); g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); return TRUE; @@ -302,17 +304,16 @@ gboolean nm_setting_wired_remove_mac_blacklist_item_by_value (NMSettingWired *setting, const char *mac) { NMSettingWiredPrivate *priv; + const char *candidate; int i; g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); g_return_val_if_fail (mac != NULL, FALSE); - if (!nm_utils_hwaddr_valid (mac, ETH_ALEN)) - return FALSE; - priv = NM_SETTING_WIRED_GET_PRIVATE (setting); for (i = 0; i < priv->mac_address_blacklist->len; i++) { - if (!strcasecmp (mac, g_array_index (priv->mac_address_blacklist, char *, i))) { + candidate = g_array_index (priv->mac_address_blacklist, char *, i); + if (!nm_utils_hwaddr_matches (mac, -1, candidate, -1)) { g_array_remove_index (priv->mac_address_blacklist, i); g_object_notify (G_OBJECT (setting), NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST); return TRUE; @@ -700,7 +701,9 @@ set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (object); - char **blacklist; + const char * const *blacklist; + const char *mac; + int i; switch (prop_id) { case PROP_PORT: @@ -719,20 +722,22 @@ set_property (GObject *object, guint prop_id, break; case PROP_MAC_ADDRESS: g_free (priv->device_mac_address); - priv->device_mac_address = g_value_dup_string (value); + priv->device_mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; case PROP_CLONED_MAC_ADDRESS: g_free (priv->cloned_mac_address); - priv->cloned_mac_address = g_value_dup_string (value); + priv->cloned_mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; case PROP_MAC_ADDRESS_BLACKLIST: - blacklist = g_value_dup_boxed (value); + blacklist = g_value_get_boxed (value); g_array_set_size (priv->mac_address_blacklist, 0); - if (blacklist) { - g_array_set_size (priv->mac_address_blacklist, g_strv_length (blacklist)); - memcpy (priv->mac_address_blacklist->data, blacklist, - priv->mac_address_blacklist->len * sizeof (char *)); - g_free (blacklist); + if (blacklist && *blacklist) { + for (i = 0; blacklist[i]; i++) { + mac = _nm_utils_hwaddr_canonical_or_invalid (blacklist[i], ETH_ALEN); + g_array_append_val (priv->mac_address_blacklist, mac); + } } break; case PROP_MTU: diff --git a/libnm-core/nm-setting-wireless.c b/libnm-core/nm-setting-wireless.c index 57cb64ee44..d374d91b7c 100644 --- a/libnm-core/nm-setting-wireless.c +++ b/libnm-core/nm-setting-wireless.c @@ -481,6 +481,7 @@ gboolean nm_setting_wireless_add_mac_blacklist_item (NMSettingWireless *setting, const char *mac) { NMSettingWirelessPrivate *priv; + const char *candidate; int i; g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); @@ -491,11 +492,12 @@ nm_setting_wireless_add_mac_blacklist_item (NMSettingWireless *setting, const ch priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); for (i = 0; i < priv->mac_address_blacklist->len; i++) { - if (!strcasecmp (mac, g_array_index (priv->mac_address_blacklist, char *, i))) + candidate = g_array_index (priv->mac_address_blacklist, char *, i); + if (nm_utils_hwaddr_matches (mac, -1, candidate, -1)) return FALSE; } - mac = g_ascii_strup (mac, -1); + mac = nm_utils_hwaddr_canonical (mac, ETH_ALEN); g_array_append_val (priv->mac_address_blacklist, mac); g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); return TRUE; @@ -536,17 +538,16 @@ gboolean nm_setting_wireless_remove_mac_blacklist_item_by_value (NMSettingWireless *setting, const char *mac) { NMSettingWirelessPrivate *priv; + const char *candidate; int i; g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); g_return_val_if_fail (mac != NULL, FALSE); - if (!nm_utils_hwaddr_valid (mac, ETH_ALEN)) - return FALSE; - priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); for (i = 0; i < priv->mac_address_blacklist->len; i++) { - if (!strcasecmp (mac, g_array_index (priv->mac_address_blacklist, char *, i))) { + candidate = g_array_index (priv->mac_address_blacklist, char *, i); + if (!nm_utils_hwaddr_matches (mac, -1, candidate, -1)) { g_array_remove_index (priv->mac_address_blacklist, i); g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); return TRUE; @@ -852,7 +853,9 @@ set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (object); - char **blacklist; + const char * const *blacklist; + const char *mac; + int i; switch (prop_id) { case PROP_SSID: @@ -883,20 +886,22 @@ set_property (GObject *object, guint prop_id, break; case PROP_MAC_ADDRESS: g_free (priv->device_mac_address); - priv->device_mac_address = g_value_dup_string (value); + priv->device_mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; case PROP_CLONED_MAC_ADDRESS: g_free (priv->cloned_mac_address); - priv->cloned_mac_address = g_value_dup_string (value); + priv->cloned_mac_address = _nm_utils_hwaddr_canonical_or_invalid (g_value_get_string (value), + ETH_ALEN); break; case PROP_MAC_ADDRESS_BLACKLIST: - blacklist = g_value_dup_boxed (value); + blacklist = g_value_get_boxed (value); g_array_set_size (priv->mac_address_blacklist, 0); - if (blacklist) { - g_array_set_size (priv->mac_address_blacklist, g_strv_length (blacklist)); - memcpy (priv->mac_address_blacklist->data, blacklist, - priv->mac_address_blacklist->len * sizeof (char *)); - g_free (blacklist); + if (blacklist && *blacklist) { + for (i = 0; blacklist[i]; i++) { + mac = _nm_utils_hwaddr_canonical_or_invalid (blacklist[i], ETH_ALEN); + g_array_append_val (priv->mac_address_blacklist, mac); + } } break; case PROP_MTU: diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h index a5b25ccf9e..bc42921514 100644 --- a/libnm-core/nm-utils-private.h +++ b/libnm-core/nm-utils-private.h @@ -67,4 +67,6 @@ char ** _nm_utils_strsplit_set (const char *str, const char *delimiters, int max_tokens); +char * _nm_utils_hwaddr_canonical_or_invalid (const char *mac, gssize length); + #endif diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 661a27fed3..dfa0d7cf81 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -2394,6 +2394,26 @@ nm_utils_hwaddr_canonical (const char *asc, gssize length) return g_strdup (nm_utils_hwaddr_ntoa (buf, length)); } +/* This is used to possibly canonicalize values passed to MAC address property + * setters. Unlike nm_utils_hwaddr_canonical(), it accepts %NULL, and if you + * pass it an invalid MAC address, it just returns that string rather than + * returning %NULL (so that we can return a proper error from verify() later). + */ +char * +_nm_utils_hwaddr_canonical_or_invalid (const char *mac, gssize length) +{ + char *canonical; + + if (!mac) + return NULL; + + canonical = nm_utils_hwaddr_canonical (mac, length); + if (canonical) + return canonical; + else + return g_strdup (mac); +} + /** * nm_utils_hwaddr_matches: * @hwaddr1: pointer to a binary or ASCII hardware address, or %NULL |