The two options metioned in the subject work on IPv4 sockets but are
invalid on IPv6 sockets.  Tweak code to set different socket options
when dealing with a v6 socket.

ok?


Index: usr.sbin/httpd/server.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/httpd/server.c,v
retrieving revision 1.97
diff -u -p -r1.97 server.c
--- usr.sbin/httpd/server.c     6 Nov 2016 16:05:02 -0000       1.97
+++ usr.sbin/httpd/server.c     10 Nov 2016 02:19:35 -0000
@@ -569,15 +569,33 @@ server_socket(struct sockaddr_storage *s
         */
        if (srv_conf->tcpflags & TCPFLAG_IPTTL) {
                val = (int)srv_conf->tcpipttl;
-               if (setsockopt(s, IPPROTO_IP, IP_TTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_TTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
        if (srv_conf->tcpflags & TCPFLAG_IPMINTTL) {
                val = (int)srv_conf->tcpipminttl;
-               if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
 
        /*
Index: usr.sbin/relayd/relay.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.216
diff -u -p -r1.216 relay.c
--- usr.sbin/relayd/relay.c     29 Sep 2016 22:04:28 -0000      1.216
+++ usr.sbin/relayd/relay.c     10 Nov 2016 02:19:16 -0000
@@ -562,15 +562,33 @@ relay_socket(struct sockaddr_storage *ss
         */
        if (proto->tcpflags & TCPFLAG_IPTTL) {
                val = (int)proto->tcpipttl;
-               if (setsockopt(s, IPPROTO_IP, IP_TTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_TTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
        if (proto->tcpflags & TCPFLAG_IPMINTTL) {
                val = (int)proto->tcpipminttl;
-               if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
 
        /*
Index: usr.sbin/relayd/relay_udp.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/relayd/relay_udp.c,v
retrieving revision 1.43
diff -u -p -r1.43 relay_udp.c
--- usr.sbin/relayd/relay_udp.c 2 Sep 2016 14:31:47 -0000       1.43
+++ usr.sbin/relayd/relay_udp.c 10 Nov 2016 02:19:16 -0000
@@ -138,15 +138,33 @@ relay_udp_socket(struct sockaddr_storage
         */
        if (proto->tcpflags & TCPFLAG_IPTTL) {
                val = (int)proto->tcpipttl;
-               if (setsockopt(s, IPPROTO_IP, IP_TTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_TTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
        if (proto->tcpflags & TCPFLAG_IPMINTTL) {
                val = (int)proto->tcpipminttl;
-               if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
-                   &val, sizeof(val)) == -1)
-                       goto bad;
+               switch (ss->ss_family) {
+               case AF_INET:
+                       if (setsockopt(s, IPPROTO_IP, IP_MINTTL,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               case AF_INET6:
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_MINHOPCOUNT,
+                           &val, sizeof(val)) == -1)
+                               goto bad;
+                       break;
+               }
        }
 
        return (s);


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to