merge: branch 'dnsconfd-port-fix'

dns: Fix port handling in Dnsconfd plugin

Closes #1765

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2211
This commit is contained in:
Beniamino Galvani
2025-05-27 08:49:59 +00:00
4 changed files with 47 additions and 41 deletions

View File

@@ -393,6 +393,12 @@ server_builder_append_base(GVariantBuilder *argument_builder,
"{sv}", "{sv}",
"name", "name",
g_variant_new("s", dns_server.servername)); g_variant_new("s", dns_server.servername));
if (dns_server.port != NM_DNS_PORT_UNDEFINED) {
g_variant_builder_add(argument_builder,
"{sv}",
"port",
g_variant_new("i", dns_server.port));
}
if (routing_domains) { if (routing_domains) {
g_variant_builder_add(argument_builder, g_variant_builder_add(argument_builder,
"{sv}", "{sv}",

View File

@@ -749,9 +749,7 @@ nm_dns_uri_parse(int addr_family, const char *str, NMDnsServer *dns)
if (!str) if (!str)
return FALSE; return FALSE;
*dns = (NMDnsServer) { *dns = (NMDnsServer) {0};
.port = -1,
};
if (NM_STR_HAS_PREFIX(str, "dns+tls://")) { if (NM_STR_HAS_PREFIX(str, "dns+tls://")) {
dns->scheme = NM_DNS_URI_SCHEME_TLS; dns->scheme = NM_DNS_URI_SCHEME_TLS;
@@ -816,8 +814,8 @@ nm_dns_uri_parse(int addr_family, const char *str, NMDnsServer *dns)
end++; end++;
if (*end == ':') { if (*end == ':') {
end++; end++;
dns->port = _nm_utils_ascii_str_to_int64(end, 10, 0, 65535, G_MAXINT32); dns->port = _nm_utils_ascii_str_to_int64(end, 10, 1, 65535, 0);
if (dns->port == G_MAXINT32) if (dns->port == 0)
return FALSE; return FALSE;
} }
} else if (addr_family != AF_INET6) { } else if (addr_family != AF_INET6) {
@@ -831,8 +829,8 @@ nm_dns_uri_parse(int addr_family, const char *str, NMDnsServer *dns)
if (port) { if (port) {
addr = nm_strndup_a(100, addr_port, port - addr_port, &addr_heap); addr = nm_strndup_a(100, addr_port, port - addr_port, &addr_heap);
port++; port++;
dns->port = _nm_utils_ascii_str_to_int64(port, 10, 0, 65535, G_MAXINT32); dns->port = _nm_utils_ascii_str_to_int64(port, 10, 1, 65535, 0);
if (dns->port == G_MAXINT32) if (dns->port == 0)
return FALSE; return FALSE;
} }
} else { } else {
@@ -885,7 +883,7 @@ nm_dns_uri_parse_plain(int addr_family, const char *str, char *out_addrstr, NMIP
} }
return TRUE; return TRUE;
case NM_DNS_URI_SCHEME_UDP: case NM_DNS_URI_SCHEME_UDP:
if (dns.port != -1 && dns.port != 53) if (dns.port != NM_DNS_PORT_UNDEFINED && dns.port != 53)
return FALSE; return FALSE;
if (dns.interface[0]) if (dns.interface[0])
return FALSE; return FALSE;
@@ -929,9 +927,9 @@ nm_dns_uri_normalize(int addr_family, const char *str, char **out_free)
nm_inet_ntop(dns.addr_family, &dns.addr, addrstr); nm_inet_ntop(dns.addr_family, &dns.addr, addrstr);
if (dns.port != -1) { if (dns.port != NM_DNS_PORT_UNDEFINED) {
nm_assert(dns.port >= 0 && dns.port <= 65535); nm_assert(dns.port >= 1 && dns.port <= 65535);
g_snprintf(portstr, sizeof(portstr), "%d", dns.port); g_snprintf(portstr, sizeof(portstr), "%" G_GUINT16_FORMAT, dns.port);
} }
switch (dns.scheme) { switch (dns.scheme) {
@@ -955,15 +953,15 @@ nm_dns_uri_normalize(int addr_family, const char *str, char **out_free)
ret = g_strconcat(addrstr, "#", dns.servername, NULL); ret = g_strconcat(addrstr, "#", dns.servername, NULL);
break; break;
case NM_DNS_URI_SCHEME_UDP: case NM_DNS_URI_SCHEME_UDP:
if (dns.interface[0] || dns.port != -1) { if (dns.interface[0] || dns.port != NM_DNS_PORT_UNDEFINED) {
ret = g_strdup_printf("dns+udp://%s%s%s%s%s%s%s", ret = g_strdup_printf("dns+udp://%s%s%s%s%s%s%s",
dns.addr_family == AF_INET6 ? "[" : "", dns.addr_family == AF_INET6 ? "[" : "",
addrstr, addrstr,
dns.interface[0] ? "%" : "", dns.interface[0] ? "%" : "",
dns.interface[0] ? dns.interface : "", dns.interface[0] ? dns.interface : "",
dns.addr_family == AF_INET6 ? "]" : "", dns.addr_family == AF_INET6 ? "]" : "",
dns.port != -1 ? ":" : "", dns.port != NM_DNS_PORT_UNDEFINED ? ":" : "",
dns.port != -1 ? portstr : ""); dns.port != NM_DNS_PORT_UNDEFINED ? portstr : "");
break; break;
} }
ret = g_strdup_printf("%s%s%s", addrstr, dns.servername ? "#" : "", dns.servername ?: ""); ret = g_strdup_printf("%s%s%s", addrstr, dns.servername ? "#" : "", dns.servername ?: "");
@@ -975,8 +973,8 @@ nm_dns_uri_normalize(int addr_family, const char *str, char **out_free)
dns.interface[0] ? "%%" : "", dns.interface[0] ? "%%" : "",
dns.interface[0] ? dns.interface : "", dns.interface[0] ? dns.interface : "",
dns.addr_family == AF_INET6 ? "]" : "", dns.addr_family == AF_INET6 ? "]" : "",
dns.port != -1 ? ":" : "", dns.port != NM_DNS_PORT_UNDEFINED ? ":" : "",
dns.port != -1 ? portstr : "", dns.port != NM_DNS_PORT_UNDEFINED ? portstr : "",
dns.servername ? "#" : "", dns.servername ? "#" : "",
dns.servername ?: ""); dns.servername ?: "");
break; break;

View File

@@ -319,13 +319,15 @@ typedef enum {
NM_DNS_URI_SCHEME_TLS, NM_DNS_URI_SCHEME_TLS,
} NMDnsUriScheme; } NMDnsUriScheme;
#define NM_DNS_PORT_UNDEFINED 0
typedef struct { typedef struct {
NMIPAddr addr; NMIPAddr addr;
const char *servername; const char *servername;
char interface[NM_IFNAMSIZ]; char interface[NM_IFNAMSIZ];
NMDnsUriScheme scheme; NMDnsUriScheme scheme;
int addr_family; int addr_family;
int port; guint16 port;
} NMDnsServer; } NMDnsServer;
gboolean nm_dns_uri_parse(int addr_family, const char *str, NMDnsServer *out_dns); gboolean nm_dns_uri_parse(int addr_family, const char *str, NMDnsServer *out_dns);

View File

@@ -11454,32 +11454,32 @@ static void
test_dns_uri_parse(void) test_dns_uri_parse(void)
{ {
/* clang-format off */ /* clang-format off */
t_dns_1("dns+tls://8.8.8.8", INET, TLS, "8.8.8.8", -1, NULL, NULL); t_dns_1("dns+tls://8.8.8.8", INET, TLS, "8.8.8.8", 0, NULL, NULL);
t_dns_1("dns+tls://8.8.8.8", INET, TLS, "8.8.8.8", -1, NULL, NULL); t_dns_1("dns+tls://8.8.8.8", INET, TLS, "8.8.8.8", 0, NULL, NULL);
t_dns_1("dns+tls://1.2.3.4#name", INET, TLS, "1.2.3.4", -1, "name", NULL); t_dns_1("dns+tls://1.2.3.4#name", INET, TLS, "1.2.3.4", 0, "name", NULL);
t_dns_1("dns+tls://1.2.3.4#a.b.c", INET, TLS, "1.2.3.4", -1, "a.b.c", NULL); t_dns_1("dns+tls://1.2.3.4#a.b.c", INET, TLS, "1.2.3.4", 0, "a.b.c", NULL);
t_dns_1("dns+tls://1.2.3.4:53", INET, TLS, "1.2.3.4", 53, NULL, NULL); t_dns_1("dns+tls://1.2.3.4:53", INET, TLS, "1.2.3.4", 53, NULL, NULL);
t_dns_1("dns+tls://1.2.3.4:53#foobar", INET, TLS, "1.2.3.4", 53, "foobar", NULL); t_dns_1("dns+tls://1.2.3.4:53#foobar", INET, TLS, "1.2.3.4", 53, "foobar", NULL);
t_dns_1("dns+tls://192.168.120.250:99", INET, TLS, "192.168.120.250", 99, NULL, NULL); t_dns_1("dns+tls://192.168.120.250:99", INET, TLS, "192.168.120.250", 99, NULL, NULL);
t_dns_1("dns+udp://8.8.8.8:65535", INET, UDP, "8.8.8.8", 65535, NULL, NULL); t_dns_1("dns+udp://8.8.8.8:65535", INET, UDP, "8.8.8.8", 65535, NULL, NULL);
t_dns_1("dns+udp://[fd01::1]", INET6, UDP, "fd01::1", -1, NULL, NULL); t_dns_1("dns+udp://[fd01::1]", INET6, UDP, "fd01::1", 0, NULL, NULL);
t_dns_1("dns+tls://[fd01::2]:5353", INET6, UDP, "fd01::2", 5353, NULL, NULL); t_dns_1("dns+tls://[fd01::2]:5353", INET6, UDP, "fd01::2", 5353, NULL, NULL);
t_dns_1("dns+tls://[::1]#name", INET6, UDP, "::1", -1, "name", NULL); t_dns_1("dns+tls://[::1]#name", INET6, UDP, "::1", 0, "name", NULL);
t_dns_1("dns+tls://[::2]:65535#name", INET6, UDP, "::2", 65535, "name", NULL); t_dns_1("dns+tls://[::2]:65535#name", INET6, UDP, "::2", 65535, "name", NULL);
t_dns_1("dns+udp://[::ffff:1.2.3.4]", INET6, UDP, "::ffff:1.2.3.4", -1, NULL, NULL); t_dns_1("dns+udp://[::ffff:1.2.3.4]", INET6, UDP, "::ffff:1.2.3.4", 0, NULL, NULL);
t_dns_1("dns+tls://[fe80::1%eth0]", INET6, UDP, "fe80::1", -1, NULL, "eth0"); t_dns_1("dns+tls://[fe80::1%eth0]", INET6, UDP, "fe80::1", 0, NULL, "eth0");
t_dns_1("dns+tls://[fe80::2%en1]:53#a", INET6, UDP, "fe80::2", 53, "a", "en1"); t_dns_1("dns+tls://[fe80::2%en1]:53#a", INET6, UDP, "fe80::2", 53, "a", "en1");
t_dns_1("dns+tls://[fe80::1%en3456789012345]", INET6, UDP, "fe80::1", -1, NULL, "en3456789012345"); t_dns_1("dns+tls://[fe80::1%en3456789012345]", INET6, UDP, "fe80::1", 0, NULL, "en3456789012345");
t_dns_1("1.2.3.4", INET, NONE, "1.2.3.4", -1, NULL, NULL); t_dns_1("1.2.3.4", INET, NONE, "1.2.3.4", 0, NULL, NULL);
t_dns_1("1.2.3.4#foo", INET, NONE, "1.2.3.4", -1, "foo", NULL); t_dns_1("1.2.3.4#foo", INET, NONE, "1.2.3.4", 0, "foo", NULL);
t_dns_1("1::#x", INET6, NONE, "1::", -1, "x", NULL); t_dns_1("1::#x", INET6, NONE, "1::", 0, "x", NULL);
t_dns_1("1::0#x", INET6, NONE, "1::", -1, "x", NULL); t_dns_1("1::0#x", INET6, NONE, "1::", 0, "x", NULL);
t_dns_1("192.168.0.1", INET, NONE, "192.168.0.1", -1, NULL, NULL); t_dns_1("192.168.0.1", INET, NONE, "192.168.0.1", 0, NULL, NULL);
t_dns_1("192.168.0.1#tst.com", INET, NONE, "192.168.0.1", -1, "tst.com", NULL); t_dns_1("192.168.0.1#tst.com", INET, NONE, "192.168.0.1", 0, "tst.com", NULL);
t_dns_1("fe80::18", INET6, NONE, "fe80::18", -1, NULL, NULL); t_dns_1("fe80::18", INET6, NONE, "fe80::18", 0, NULL, NULL);
t_dns_1("fe80::18#foo.com", INET6, NONE, "fe80::18", -1, "foo.com", NULL); t_dns_1("fe80::18#foo.com", INET6, NONE, "fe80::18", 0, "foo.com", NULL);
/* clang-format on */ /* clang-format on */
t_dns_0("http://8.8.8.8"); /* unsupported schema */ t_dns_0("http://8.8.8.8"); /* unsupported schema */