summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-04-11 14:15:01 +0200
committerThomas Haller <thaller@redhat.com>2016-04-12 11:16:37 +0200
commit013ac9dfb2e4208bac11181d76a9b1c1e62da5ff (patch)
tree93bf78c60a71d1555ddeb54896c5ed0b75b2dafa
parentb973efdfa50188bb8c9c6f694085d4b4e1b95dd5 (diff)
parentb78e4de648caecc2c3edf9a5ad2dd172ad7e1e43 (diff)
downloadNetworkManager-013ac9dfb2e4208bac11181d76a9b1c1e62da5ff.tar.gz
libnm-core,core: merge branch 'th/nm-ip-address-zero-prefix'
(cherry picked from commit defc7fc89afe1b333e6257b3c61c9337ab31afe6)
-rw-r--r--libnm-core/nm-setting-ip-config.c37
-rw-r--r--src/nm-ip4-config.c4
-rw-r--r--src/nm-ip6-config.c4
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.c52
4 files changed, 43 insertions, 54 deletions
diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c
index 4e3088a98a..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
@@ -175,6 +173,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)
@@ -211,7 +212,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))
return NULL;
address = g_slice_new0 (NMIPAddress);
@@ -248,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, FALSE))
+ if (!valid_prefix (family, prefix, error))
return NULL;
address = g_slice_new0 (NMIPAddress);
@@ -484,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, FALSE));
+ g_return_if_fail (valid_prefix (address->family, prefix, NULL));
address->prefix = prefix;
}
@@ -566,6 +567,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)
@@ -610,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;
@@ -657,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;
@@ -898,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;
}
@@ -1105,6 +1109,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)
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;
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);
- }
- }
-
- 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);
+ } 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/%ld", prefix_tag, ip, prefix);
+ 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;
+ }
+ }
}
}
- /* 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;