diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index 59b9f04b1f..ba5380afb2 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -544,7 +544,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) NMSettingConnection *s_con; NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL; gs_unref_hashtable GHashTable *ibft = NULL; - const char *tmp; + char *tmp; const char *tmp2; const char *tmp3; const char *kind; @@ -589,15 +589,25 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) kind = tmp3; } else { /* :[]:::: */ - client_ip = tmp; + + /* note: split here address and prefix to normalize IPs defined as + * [dead::beef]/64. Latter parsing would fail due to the '[]'. */ + client_ip = get_word(&tmp, '/'); + if (client_ip) { - client_ip_family = get_ip_address_family(client_ip, TRUE); + client_ip_family = get_ip_address_family(client_ip, FALSE); if (client_ip_family == AF_UNSPEC) { _LOGW(LOGD_CORE, "Invalid IP address '%s'.", client_ip); return; } } + if (!nm_str_is_empty(tmp)) { + gboolean is_ipv4 = client_ip_family == AF_INET; + + client_ip_prefix = _nm_utils_ascii_str_to_int64(tmp, 10, 0, is_ipv4 ? 32 : 128, -1); + } + peer = tmp2; gateway_ip = get_word(&argument, ':'); netmask = get_word(&argument, ':'); @@ -672,11 +682,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) NMIPAddress *address = NULL; NMIPAddr addr; - if (nm_inet_parse_with_prefix_bin(client_ip_family, - client_ip, - NULL, - &addr, - client_ip_prefix == -1 ? &client_ip_prefix : NULL)) { + if (nm_inet_parse_bin(client_ip_family, client_ip, NULL, &addr)) { if (client_ip_prefix == -1) { switch (client_ip_family) { case AF_INET: diff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c index af13849c8c..cd7b1069b6 100644 --- a/src/nm-initrd-generator/tests/test-cmdline-reader.c +++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c @@ -597,7 +597,7 @@ static void test_if_ip6_manual(void) { gs_unref_hashtable GHashTable *connections = NULL; - const char *const *ARGV = NM_MAKE_STRV("ip=[2001:0db8::02]/64::[2001:0db8::01]::" + const char *const *ARGV = NM_MAKE_STRV("ip=[2001:0db8::02]/56::[2001:0db8::01]::" "hostname0.example.com:eth4::[2001:0db8::53]"); NMConnection *connection; NMSettingIPConfig *s_ip4; @@ -633,7 +633,7 @@ test_if_ip6_manual(void) ip_addr = nm_setting_ip_config_get_address(s_ip6, 0); g_assert(ip_addr); g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::2"); - g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 64); + g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 56); g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1"); g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, NULL); }