From dd750e44a1409cf06764e320a2028af243a6524c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 12:29:33 +0200 Subject: [PATCH 1/5] libnm-core/trivial: add code comment (cherry picked from commit d68ccb84f1e7a27f7142de1cbe3c527f4fb32da9) --- libnm-core/nm-setting-ip-config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 4e3088a98a..45b0b768f8 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -175,6 +175,9 @@ valid_metric (gint64 metric, GError **error) return TRUE; } +/***************************************************************************** + * NMIPAddress + *****************************************************************************/ G_DEFINE_BOXED_TYPE (NMIPAddress, nm_ip_address, nm_ip_address_dup, nm_ip_address_unref) @@ -566,6 +569,9 @@ nm_ip_address_set_attribute (NMIPAddress *address, const char *name, GVariant *v g_hash_table_remove (address->attributes, name); } +/***************************************************************************** + * NMIPRoute + *****************************************************************************/ G_DEFINE_BOXED_TYPE (NMIPRoute, nm_ip_route, nm_ip_route_dup, nm_ip_route_unref) @@ -1105,6 +1111,7 @@ nm_ip_route_set_attribute (NMIPRoute *route, const char *name, GVariant *value) g_hash_table_remove (route->attributes, name); } +/*****************************************************************************/ G_DEFINE_ABSTRACT_TYPE (NMSettingIPConfig, nm_setting_ip_config, NM_TYPE_SETTING) From b1f58fcd9545248d41ad97bbcb0efa338e3efe29 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 12:31:05 +0200 Subject: [PATCH 2/5] libnm-core: allow zero prefix length in NMIPAddress Adding addresses with a prefix of zero is valid. Don't reject them. Note that this is an actual bug. If you configure an address with prefix length zero, nmcli will report: $nmcli connection (process:1040): libnm-WARNING **: Ignoring invalid IP4 address: Invalid IPv4 address prefix '0' (cherry picked from commit 57860c329e2f2561854671a43803bbf31f05a723) --- libnm-core/nm-setting-ip-config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 45b0b768f8..1b822072b7 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -214,7 +214,7 @@ nm_ip_address_new (int family, if (!valid_ip (family, addr, error)) return NULL; - if (!valid_prefix (family, prefix, error, FALSE)) + if (!valid_prefix (family, prefix, error, TRUE)) return NULL; address = g_slice_new0 (NMIPAddress); @@ -251,7 +251,7 @@ nm_ip_address_new_binary (int family, g_return_val_if_fail (family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail (addr != NULL, NULL); - if (!valid_prefix (family, prefix, error, FALSE)) + if (!valid_prefix (family, prefix, error, TRUE)) return NULL; address = g_slice_new0 (NMIPAddress); @@ -487,7 +487,7 @@ nm_ip_address_set_prefix (NMIPAddress *address, guint prefix) { g_return_if_fail (address != NULL); - g_return_if_fail (valid_prefix (address->family, prefix, NULL, FALSE)); + g_return_if_fail (valid_prefix (address->family, prefix, NULL, TRUE)); address->prefix = prefix; } From 54df309a9fc619c50f24a372f6001287c8d8efd0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 12:40:34 +0200 Subject: [PATCH 3/5] libnm-core: drup unused @allow_zero_prefix argument from valid_prefix() (cherry picked from commit 6b8729a5996deec34b38a13007b48250b64ba385) --- libnm-core/nm-setting-ip-config.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 1b822072b7..3e7f93b065 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -143,18 +143,16 @@ valid_ip (int family, const char *ip, GError **error) } static gboolean -valid_prefix (int family, guint prefix, GError **error, gboolean allow_zero_prefix) +valid_prefix (int family, guint prefix, GError **error) { - if ( (family == AF_INET && prefix > 32) - || (family == AF_INET6 && prefix > 128) - || (!allow_zero_prefix && prefix == 0)) { - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, - family == AF_INET ? _("Invalid IPv4 address prefix '%u'") : _("Invalid IPv6 address prefix '%u'"), - prefix); - return FALSE; - } + if ( (family == AF_INET && prefix <= 32) + || (family == AF_INET6 && prefix <= 128)) + return TRUE; - return TRUE; + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + family == AF_INET ? _("Invalid IPv4 address prefix '%u'") : _("Invalid IPv6 address prefix '%u'"), + prefix); + return FALSE; } static gboolean @@ -214,7 +212,7 @@ nm_ip_address_new (int family, if (!valid_ip (family, addr, error)) return NULL; - if (!valid_prefix (family, prefix, error, TRUE)) + if (!valid_prefix (family, prefix, error)) return NULL; address = g_slice_new0 (NMIPAddress); @@ -251,7 +249,7 @@ nm_ip_address_new_binary (int family, g_return_val_if_fail (family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail (addr != NULL, NULL); - if (!valid_prefix (family, prefix, error, TRUE)) + if (!valid_prefix (family, prefix, error)) return NULL; address = g_slice_new0 (NMIPAddress); @@ -487,7 +485,7 @@ nm_ip_address_set_prefix (NMIPAddress *address, guint prefix) { g_return_if_fail (address != NULL); - g_return_if_fail (valid_prefix (address->family, prefix, NULL, TRUE)); + g_return_if_fail (valid_prefix (address->family, prefix, NULL)); address->prefix = prefix; } @@ -616,7 +614,7 @@ nm_ip_route_new (int family, if (!valid_ip (family, dest, error)) return NULL; - if (!valid_prefix (family, prefix, error, TRUE)) + if (!valid_prefix (family, prefix, error)) return NULL; if (next_hop && !valid_ip (family, next_hop, error)) return NULL; @@ -663,7 +661,7 @@ nm_ip_route_new_binary (int family, g_return_val_if_fail (family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail (dest, NULL); - if (!valid_prefix (family, prefix, error, TRUE)) + if (!valid_prefix (family, prefix, error)) return NULL; if (!valid_metric (metric, error)) return NULL; @@ -904,7 +902,7 @@ nm_ip_route_set_prefix (NMIPRoute *route, guint prefix) { g_return_if_fail (route != NULL); - g_return_if_fail (valid_prefix (route->family, prefix, NULL, TRUE)); + g_return_if_fail (valid_prefix (route->family, prefix, NULL)); route->prefix = prefix; } From 7b280fa1625a89844a81eefe6598a26998e0089f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 12:49:47 +0200 Subject: [PATCH 4/5] core: expose NMIPAddress instances with prefix zero on D-Bus Since commit 44768f0311deb9082c69e3525693091a59788ebb, we skip exposing NMIPAddress instances with prefix zero. Now, that is supported and we can remove the check. (cherry picked from commit 420bd611fdbf78a33f5dcb9697238527b87c77d4) --- src/nm-ip4-config.c | 4 ---- src/nm-ip6-config.c | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index d6f6a9b3fc..75caf7e33c 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -567,10 +567,6 @@ nm_ip4_config_create_setting (const NMIP4Config *config) continue; } - /* FIXME: NMIPAddress doesn't support zero prefixes. */ - if (address->plen == 0) - continue; - /* Static address found. */ if (!method) method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL; diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 0b32901bf1..8e7bd22cc1 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -556,10 +556,6 @@ nm_ip6_config_create_setting (const NMIP6Config *config) continue; } - /* FIXME: NMIPAddress does not support zero prefixes. */ - if (address->plen == 0) - continue; - /* Static address found. */ if (!method || strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL) == 0) method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL; From b78e4de648caecc2c3edf9a5ad2dd172ad7e1e43 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 13:01:42 +0200 Subject: [PATCH 5/5] ifcfg-rh: support zero prefix length for IP addresses in reader (cherry picked from commit a170320c3564d42e14dc6bdee07c9c5e3ba24877) --- src/settings/plugins/ifcfg-rh/reader.c | 54 +++++++++++--------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 41ffa27db9..39e981f959 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -358,7 +358,7 @@ read_full_ip4_address (shvarFile *ifcfg, { char *ip_tag, *prefix_tag, *netmask_tag, *gw_tag; char *ip = NULL; - long prefix = 0; + int prefix = 0; gboolean success = FALSE; char *value; guint32 tmp; @@ -395,47 +395,40 @@ read_full_ip4_address (shvarFile *ifcfg, /* Prefix */ value = svGetValue (ifcfg, prefix_tag, FALSE); if (value) { - errno = 0; - prefix = strtol (value, NULL, 10); - if (errno || prefix < 0) { + prefix = _nm_utils_ascii_str_to_int64 (value, 10, 0, 32, -1); + if (prefix < 0) { g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, "Invalid IP4 prefix '%s'", value); g_free (value); goto done; } g_free (value); - } - - /* Fall back to NETMASK if no PREFIX was specified */ - if (prefix == 0) { + } else { + /* Fall back to NETMASK if no PREFIX was specified */ if (!read_ip4_address (ifcfg, netmask_tag, &value, error)) goto done; if (value) { inet_pton (AF_INET, value, &tmp); prefix = nm_utils_ip4_netmask_to_prefix (tmp); g_free (value); + } else { + if (base_addr) + prefix = nm_ip_address_get_prefix (base_addr); + else { + /* Try to autodetermine the prefix for the address' class */ + if (inet_pton (AF_INET, ip, &tmp) == 1) { + prefix = nm_utils_ip4_get_default_prefix (tmp); + + PARSE_WARNING ("missing %s, assuming %s/%d", prefix_tag, ip, prefix); + } else { + g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, + "Missing IP4 prefix"); + goto done; + } + } } } - if (prefix == 0 && base_addr) - prefix = nm_ip_address_get_prefix (base_addr); - - /* Try to autodetermine the prefix for the address' class */ - if (prefix == 0) { - if (inet_pton (AF_INET, ip, &tmp) == 1) { - prefix = nm_utils_ip4_get_default_prefix (tmp); - - PARSE_WARNING ("missing %s, assuming %s/%ld", prefix_tag, ip, prefix); - } - } - - /* Validate the prefix */ - if (prefix == 0) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "Missing IP4 prefix"); - goto done; - } - *out_address = nm_ip_address_new (AF_INET, ip, prefix, error); if (*out_address) success = TRUE; @@ -717,7 +710,7 @@ parse_full_ip6_address (shvarFile *ifcfg, { char **list; char *ip_val, *prefix_val; - long prefix; + int prefix; gboolean success = FALSE; g_return_val_if_fail (addr_str != NULL, FALSE); @@ -737,9 +730,8 @@ parse_full_ip6_address (shvarFile *ifcfg, prefix_val = list[1]; if (prefix_val) { - errno = 0; - prefix = strtol (prefix_val, NULL, 10); - if (errno || prefix <= 0 || prefix > 128) { + prefix = _nm_utils_ascii_str_to_int64 (prefix_val, 10, 0, 128, -1); + if (prefix < 0) { g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, "Invalid IP6 prefix '%s'", prefix_val); goto error;