all: merge branch 'th/static-default-route'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/229
This commit is contained in:
Thomas Haller 2019-08-13 10:45:33 +02:00
commit 2c5176912d
8 changed files with 59 additions and 53 deletions

View file

@ -367,7 +367,7 @@ _parse_ip_route (int family,
}
prefix = MAX_PREFIX;
if (plen) {
if ((prefix = _nm_utils_ascii_str_to_int64 (plen, 10, 1, MAX_PREFIX, -1)) == -1) {
if ((prefix = _nm_utils_ascii_str_to_int64 (plen, 10, 0, MAX_PREFIX, -1)) == -1) {
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
_("invalid prefix '%s'; <1-%d> allowed"),
plen, MAX_PREFIX);

View file

@ -49,18 +49,28 @@
* to detect parsing failures.
*
* Returns: either %TRUE or %FALSE if the key exists and is parsable as a boolean.
* Otherwise, @default_value.
* Otherwise, @default_value. Sets errno to ENODATA, EINVAL or 0, depending on whether
* the key exists, whether the value is invalid, or success.
*/
int
nm_key_file_get_boolean (GKeyFile *kf, const char *group, const char *key, int default_value)
{
int v;
gs_free char *value = NULL;
value = g_key_file_get_value (kf, group, key, NULL);
if (!value)
if (!value) {
errno = ENODATA;
return default_value;
return _nm_utils_ascii_str_to_bool (value, default_value);
}
v = _nm_utils_ascii_str_to_bool (value, -1);
if (v != -1) {
errno = 0;
return v;
}
errno = EINVAL;
return default_value;
}
/*****************************************************************************/

View file

@ -248,15 +248,16 @@ static gpointer
build_route (KeyfileReaderInfo *info,
const char *property_name,
int family,
const char *dest_str, guint32 plen,
const char *gateway_str, const char *metric_str)
const char *dest_str,
guint32 plen,
const char *gateway_str,
const char *metric_str)
{
NMIPRoute *route;
guint32 u32;
gint64 metric = -1;
GError *error = NULL;
g_return_val_if_fail (plen, NULL);
g_return_val_if_fail (dest_str, NULL);
/* Next hop */
@ -294,7 +295,10 @@ build_route (KeyfileReaderInfo *info,
metric = u32;
}
route = nm_ip_route_new (family, dest_str, plen, gateway_str,
route = nm_ip_route_new (family,
dest_str,
plen,
gateway_str,
metric,
&error);
if (!route) {
@ -517,8 +521,7 @@ read_one_ip_address_or_route (KeyfileReaderInfo *info,
/* parse plen, fallback to defaults */
if (plen_str) {
if ( !get_one_int (info, property_name, plen_str, ipv6 ? 128 : 32, &plen)
|| (route && plen == 0)) {
if (!get_one_int (info, property_name, plen_str, ipv6 ? 128 : 32, &plen)) {
plen = DEFAULT_PREFIX (route, ipv6);
if ( info->error
|| !handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
@ -536,12 +539,19 @@ read_one_ip_address_or_route (KeyfileReaderInfo *info,
/* build the appropriate data structure for NetworkManager settings */
if (route) {
result = build_route (info, property_name,
result = build_route (info,
property_name,
ipv6 ? AF_INET6 : AF_INET,
address_str, plen, gateway_str, metric_str);
address_str,
plen,
gateway_str,
metric_str);
} else {
result = build_address (info, ipv6 ? AF_INET6 : AF_INET,
address_str, plen, property_name);
result = build_address (info,
ipv6 ? AF_INET6 : AF_INET,
address_str,
plen,
property_name);
if (!result)
return NULL;
if (gateway_str)

View file

@ -1312,8 +1312,6 @@ nm_ip_route_attribute_validate (const char *name,
if (g_variant_type_equal (spec->type, G_VARIANT_TYPE_STRING)) {
const char *string = g_variant_get_string (value, NULL);
gs_free char *string_free = NULL;
char *sep;
switch (spec->str_type) {
case 'a': /* IP address */
@ -1328,30 +1326,35 @@ nm_ip_route_attribute_validate (const char *name,
return FALSE;
}
break;
case 'p': /* IP address + optional prefix */
string_free = g_strdup (string);
sep = strchr (string_free, '/');
if (sep) {
*sep = 0;
if (_nm_utils_ascii_str_to_int64 (sep + 1, 10, 1, family == AF_INET ? 32 : 128, -1) < 0) {
case 'p': /* IP address + optional prefix */ {
gs_free char *addr_free = NULL;
const char *addr = string;
const char *str;
str = strchr (addr, '/');
if (str) {
addr = nm_strndup_a (200, addr, str - addr, &addr_free);
str++;
if (_nm_utils_ascii_str_to_int64 (str, 10, 0, family == AF_INET ? 32 : 128, -1) < 0) {
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_FAILED,
_("invalid prefix %s"), sep + 1);
_("invalid prefix %s"), str);
return FALSE;
}
}
if (!nm_utils_ipaddr_valid (family, string_free)) {
if (!nm_utils_ipaddr_valid (family, addr)) {
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_FAILED,
family == AF_INET ?
_("'%s' is not a valid IPv4 address") :
_("'%s' is not a valid IPv6 address"),
string_free);
string);
return FALSE;
}
break;
}
default:
break;
}
@ -5002,15 +5005,6 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_IP_CONFIG_ROUTES);
return FALSE;
}
if (nm_ip_route_get_prefix (route) == 0) {
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("%d. route cannot be a default route"),
(int) (i + 1));
g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_IP_CONFIG_ROUTES);
return FALSE;
}
}
if (priv->routing_rules) {

View file

@ -991,8 +991,6 @@ nm_ip4_config_merge_setting (NMIP4Config *self,
route.plen = nm_ip_route_get_prefix (s_route);
nm_assert (route.plen <= 32);
if (route.plen == 0)
continue;
nm_ip_route_get_next_hop_binary (s_route, &route.gateway);
if (nm_ip_route_get_metric (s_route) == -1)

View file

@ -672,8 +672,6 @@ nm_ip6_config_merge_setting (NMIP6Config *self,
route.plen = nm_ip_route_get_prefix (s_route);
nm_assert (route.plen <= 128);
if (route.plen == 0)
continue;
nm_ip_route_get_next_hop_binary (s_route, &route.gateway);
if (nm_ip_route_get_metric (s_route) == -1)

View file

@ -1116,15 +1116,6 @@ next:
? info_to->v.addr.plen
: (addr_family == AF_INET ? 32 : 128);
if ( ( (addr_family == AF_INET && !info_to->v.addr.addr.addr4)
|| (addr_family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED (&info_to->v.addr.addr.addr6)))
&& prefix == 0) {
/* we ignore default routes by returning -ERANGE. */
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Ignore manual default route");
return -ERANGE;
}
route = nm_ip_route_new_binary (addr_family,
&info_to->v.addr.addr,
prefix,
@ -1244,7 +1235,7 @@ read_one_ip4_route (shvarFile *ifcfg,
return FALSE;
if (has_key) {
prefix = nm_utils_ip4_netmask_to_prefix (netmask);
if (prefix == 0 || netmask != _nm_utils_ip4_prefix_to_netmask (prefix)) {
if (netmask != _nm_utils_ip4_prefix_to_netmask (prefix)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid IP4 netmask '%s' \"%s\"", netmask_tag, nm_utils_inet4_ntop (netmask, inet_buf));
return FALSE;

View file

@ -1520,10 +1520,8 @@ test_read_wired_ipv6_manual (void)
NMIPAddress *ip6_addr;
NMIPRoute *ip6_route;
NMTST_EXPECT_NM_WARN ("*ignoring manual default route*");
connection = _connection_from_file (TEST_IFCFG_DIR"/ifcfg-test-wired-ipv6-manual",
NULL, TYPE_ETHERNET, &unmanaged);
g_test_assert_expected_messages ();
g_assert (!unmanaged);
/* ===== CONNECTION SETTING ===== */
@ -1581,7 +1579,7 @@ test_read_wired_ipv6_manual (void)
g_assert_cmpint (nm_ip_address_get_prefix (ip6_addr), ==, 96);
/* Routes */
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 3);
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 4);
/* Route #1 */
ip6_route = nm_setting_ip_config_get_route (s_ip6, 0);
g_assert (ip6_route);
@ -1592,12 +1590,19 @@ test_read_wired_ipv6_manual (void)
/* Route #2 */
ip6_route = nm_setting_ip_config_get_route (s_ip6, 1);
g_assert (ip6_route);
g_assert_cmpstr (nm_ip_route_get_dest (ip6_route), ==, "::");
g_assert_cmpint (nm_ip_route_get_prefix (ip6_route), ==, 0);
g_assert_cmpstr (nm_ip_route_get_next_hop (ip6_route), ==, "dead::beaf");
g_assert_cmpint (nm_ip_route_get_metric (ip6_route), ==, -1);
/* Route #3 */
ip6_route = nm_setting_ip_config_get_route (s_ip6, 2);
g_assert (ip6_route);
g_assert_cmpstr (nm_ip_route_get_dest (ip6_route), ==, "abbe::cafe");
g_assert_cmpint (nm_ip_route_get_prefix (ip6_route), ==, 64);
g_assert_cmpstr (nm_ip_route_get_next_hop (ip6_route), ==, NULL);
g_assert_cmpint (nm_ip_route_get_metric (ip6_route), ==, 777);
/* Route #3 */
ip6_route = nm_setting_ip_config_get_route (s_ip6, 2);
/* Route #4 */
ip6_route = nm_setting_ip_config_get_route (s_ip6, 3);
g_assert (ip6_route);
g_assert_cmpstr (nm_ip_route_get_dest (ip6_route), ==, "aaaa::cccc");
g_assert_cmpint (nm_ip_route_get_prefix (ip6_route), ==, 64);