From 3ec40f9fa9c22aa17050299cbd0c5ca3f5edc825 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Apr 2016 10:45:24 +0200 Subject: [PATCH] dnsmasq: fix using '%' delimiter to scope link local with zone-id Since long, dnsmasq supports scoping the IPv6 address with '@'. Since 2.58, it also supports '%' as delimiter, which is the standard way to specify the zone-id (rfc6874). Since 2.73, specifying the scope with '@' as "server" address is no longer working properly, thus breaking NetworkManager with dnsmasq >= 2.73. To work around that, use '%' delimiter. That breaks pre-2.58 users that have a DNS server on a link local address, but that seems acceptable as that version was released in January 2012. https://bugzilla.gnome.org/show_bug.cgi?id=764839 (cherry picked from commit c328cf52f2b219feb5ae03fd40175f6b6ca73975) --- src/dns-manager/nm-dns-dnsmasq.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c index 460feaaccb..5ead5ecf3b 100644 --- a/src/dns-manager/nm-dns-dnsmasq.c +++ b/src/dns-manager/nm-dns-dnsmasq.c @@ -131,18 +131,18 @@ ip6_addr_to_string (const struct in6_addr *addr, const char *iface) char *buf; if (IN6_IS_ADDR_V4MAPPED (addr)) { - /* inet_ntop is probably supposed to do this for us, but it doesn't */ buf = g_malloc (INET_ADDRSTRLEN); nm_utils_inet4_ntop (addr->s6_addr32[3], buf); } else if (!iface || !iface[0] || !IN6_IS_ADDR_LINKLOCAL (addr)) { buf = g_malloc (INET6_ADDRSTRLEN); nm_utils_inet6_ntop (addr, buf); } else { - /* If we got a scope identifier, we need use '%' instead of - * '@', since dnsmasq supports '%' in server= addresses - * only since version 2.58 and up + /* Need to scope the address with %. Before dnsmasq 2.58, + * only '@' was supported as delimiter. Since 2.58, '@' and '%' + * are supported. Due to a bug, since 2.73 only '%' works properly + * as "server" address. */ - buf = g_strconcat (nm_utils_inet6_ntop (addr, NULL), "@", iface, NULL); + buf = g_strconcat (nm_utils_inet6_ntop (addr, NULL), "%", iface, NULL); } return buf; }