Hi,

as noted on misc dig does not like to talk to local link addresses.
This fixes that case. While investigating I also found another bug:
selecting v6 or v4 addresses only from resolv.conf via the -4 or -6
command line argument does not work as expected.

This fixes both. I did not test binding to a src address with this.
This is likely as broken as it was before.

        -Otto

Index: dig.c
===================================================================
RCS file: /cvs/src/usr.bin/dig/dig.c,v
retrieving revision 1.18
diff -u -p -r1.18 dig.c
--- dig.c       15 Sep 2020 11:47:42 -0000      1.18
+++ dig.c       17 Dec 2020 11:06:49 -0000
@@ -1358,7 +1358,7 @@ dash_option(char *option, char *next, di
                } else
                        srcport = 0;
                if (have_ipv6 && inet_pton(AF_INET6, value, &in6) == 1)
-                       isc_sockaddr_fromin6(&bind_address, &in6, srcport);
+                       isc_sockaddr_fromin6(&bind_address, &in6, srcport, 0);
                else if (have_ipv4 && inet_pton(AF_INET, value, &in4) == 1)
                        isc_sockaddr_fromin(&bind_address, &in4, srcport);
                else
Index: dighost.c
===================================================================
RCS file: /cvs/src/usr.bin/dig/dighost.c,v
retrieving revision 1.34
diff -u -p -r1.34 dighost.c
--- dighost.c   15 Sep 2020 11:47:42 -0000      1.34
+++ dighost.c   17 Dec 2020 11:06:49 -0000
@@ -540,7 +540,7 @@ get_addresses(const char *hostname, in_p
                        struct sockaddr_in6 *sin6;
                        sin6 = (struct sockaddr_in6 *)tmpai->ai_addr;
                        isc_sockaddr_fromin6(&addrs[i], &sin6->sin6_addr,
-                                            dstport);
+                                            dstport, sin6->sin6_scope_id);
                }
                i++;
 
@@ -972,7 +972,7 @@ parse_netprefix(struct sockaddr_storage 
 
        if (inet_pton(AF_INET6, buf, &in6) == 1) {
                parsed = 1;
-               isc_sockaddr_fromin6(sa, &in6, 0);
+               isc_sockaddr_fromin6(sa, &in6, 0, 0);
                if (prefix_length > 128)
                        prefix_length = 128;
        } else if (inet_pton(AF_INET, buf, &in4) == 1) {
Index: lib/isc/sockaddr.c
===================================================================
RCS file: /cvs/src/usr.bin/dig/lib/isc/sockaddr.c,v
retrieving revision 1.14
diff -u -p -r1.14 sockaddr.c
--- lib/isc/sockaddr.c  28 Nov 2020 06:33:55 -0000      1.14
+++ lib/isc/sockaddr.c  17 Dec 2020 11:06:49 -0000
@@ -223,7 +223,7 @@ isc_sockaddr_anyofpf(struct sockaddr_sto
 
 void
 isc_sockaddr_fromin6(struct sockaddr_storage *sockaddr, const struct in6_addr 
*ina6,
-                    in_port_t port)
+                    in_port_t port, uint32_t scope)
 {
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sockaddr;
        memset(sockaddr, 0, sizeof(*sockaddr));
@@ -231,6 +231,7 @@ isc_sockaddr_fromin6(struct sockaddr_sto
        sin6->sin6_len = sizeof(*sin6);
        sin6->sin6_addr = *ina6;
        sin6->sin6_port = htons(port);
+       sin6->sin6_scope_id = scope;
 }
 
 int
Index: lib/isc/include/isc/sockaddr.h
===================================================================
RCS file: /cvs/src/usr.bin/dig/lib/isc/include/isc/sockaddr.h,v
retrieving revision 1.7
diff -u -p -r1.7 sockaddr.h
--- lib/isc/include/isc/sockaddr.h      15 Sep 2020 11:47:42 -0000      1.7
+++ lib/isc/include/isc/sockaddr.h      17 Dec 2020 11:06:49 -0000
@@ -91,7 +91,7 @@ isc_sockaddr_fromin(struct sockaddr_stor
 
 void
 isc_sockaddr_fromin6(struct sockaddr_storage *sockaddr, const struct in6_addr 
*ina6,
-                    in_port_t port);
+                    in_port_t port, uint32_t scope);
 /*%<
  * Construct an struct sockaddr_storage from an IPv6 address and port.
  */
Index: lib/lwres/lwconfig.c
===================================================================
RCS file: /cvs/src/usr.bin/dig/lib/lwres/lwconfig.c,v
retrieving revision 1.6
diff -u -p -r1.6 lwconfig.c
--- lib/lwres/lwconfig.c        25 Feb 2020 05:00:43 -0000      1.6
+++ lib/lwres/lwconfig.c        17 Dec 2020 11:06:49 -0000
@@ -231,7 +231,7 @@ lwres_conf_parsenameserver(lwres_conf_t 
 
        res = lwres_create_addr(word, &address, 1);
        use_ipv4 = confdata->flags & LWRES_USEIPV4;
-       use_ipv6 = confdata->flags & LWRES_USEIPV4;
+       use_ipv6 = confdata->flags & LWRES_USEIPV6;
        if (res == LWRES_R_SUCCESS &&
            ((address.family == LWRES_ADDRTYPE_V4 && use_ipv4) ||
            (address.family == LWRES_ADDRTYPE_V6 && use_ipv6))) {

Reply via email to