Author: ae
Date: Fri Mar 13 13:46:50 2015
New Revision: 279956
URL: https://svnweb.freebsd.org/changeset/base/279956

Log:
  Properly initialize scope zone id when next hop address stored
  directly in the O_FORWARD_IP6 opcode. Use getnameinfo(3) to formatting
  the IPv6 addresses of such opcodes.
  
  Obtained from:        Yandex LLC
  Sponsored by: Yandex LLC

Modified:
  head/sbin/ipfw/ipfw2.c

Modified: head/sbin/ipfw/ipfw2.c
==============================================================================
--- head/sbin/ipfw/ipfw2.c      Fri Mar 13 12:44:46 2015        (r279955)
+++ head/sbin/ipfw/ipfw2.c      Fri Mar 13 13:46:50 2015        (r279956)
@@ -1525,11 +1525,14 @@ show_static_rule(struct cmdline_opts *co
 
                case O_FORWARD_IP6:
                    {
-                       char buf[4 + INET6_ADDRSTRLEN + 1];
+                       char buf[INET6_ADDRSTRLEN + IF_NAMESIZE + 2];
                        ipfw_insn_sa6 *s = (ipfw_insn_sa6 *)cmd;
 
-                       bprintf(bp, "fwd %s", inet_ntop(AF_INET6,
-                           &s->sa.sin6_addr, buf, sizeof(buf)));
+                       bprintf(bp, "fwd ");
+                       if (getnameinfo((const struct sockaddr *)&s->sa,
+                           sizeof(struct sockaddr_in6), buf, sizeof(buf),
+                           NULL, 0, NI_NUMERICHOST) == 0)
+                               bprintf(bp, "%s", buf);
                        if (s->sa.sin6_port)
                                bprintf(bp, ",%d", s->sa.sin6_port);
                    }
@@ -3741,8 +3744,8 @@ chkarg:
                        p->sa.sin6_family = AF_INET6;
                        p->sa.sin6_port = port_number;
                        p->sa.sin6_flowinfo = 0;
-                       p->sa.sin6_scope_id = 0;
-                       /* No table support for v6 yet. */
+                       p->sa.sin6_scope_id =
+                           ((struct sockaddr_in6 *)&result)->sin6_scope_id;
                        bcopy(&((struct sockaddr_in6*)&result)->sin6_addr,
                            &p->sa.sin6_addr, sizeof(p->sa.sin6_addr));
                } else {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to