Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-1-6]: src/dist/bind/lib/inet Pull up revision 1.3 (requested by i...



details:   https://anonhg.NetBSD.org/src/rev/dc15c2d2b362
branches:  netbsd-1-6
changeset: 528189:dc15c2d2b362
user:      lukem <lukem%NetBSD.org@localhost>
date:      Fri Jun 28 11:45:03 2002 +0000

description:
Pull up revision 1.3 (requested by itojun in ticket #387):
Update to BIND 8.3.3.  Fixes buffer overrun in resolver code.

diffstat:

 dist/bind/lib/inet/inet_net_ntop.c |  137 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 135 insertions(+), 2 deletions(-)

diffs (176 lines):

diff -r 33952bb133a4 -r dc15c2d2b362 dist/bind/lib/inet/inet_net_ntop.c
--- a/dist/bind/lib/inet/inet_net_ntop.c        Fri Jun 28 11:44:54 2002 +0000
+++ b/dist/bind/lib/inet/inet_net_ntop.c        Fri Jun 28 11:45:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: inet_net_ntop.c,v 1.2 2001/01/27 07:22:03 itojun Exp $ */
+/*     $NetBSD: inet_net_ntop.c,v 1.2.2.1 2002/06/28 11:45:03 lukem Exp $      */
 
 /*
  * Copyright (c) 1996,1999 by Internet Software Consortium.
@@ -18,7 +18,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "Id: inet_net_ntop.c,v 1.7 2001/01/25 19:55:59 vixie Exp";
+static const char rcsid[] = "Id: inet_net_ntop.c,v 1.8 2001/09/27 15:08:36 marka Exp";
 #endif
 
 #include "port_before.h"
@@ -43,6 +43,8 @@
 
 static char *  inet_net_ntop_ipv4 __P((const u_char *src, int bits,
                                        char *dst, size_t size));
+static char *  inet_net_ntop_ipv6 __P((const u_char *src, int bits,
+                                       char *dst, size_t size));
 
 /*
  * char *
@@ -65,6 +67,8 @@
        switch (af) {
        case AF_INET:
                return (inet_net_ntop_ipv4(src, bits, dst, size));
+       case AF_INET6:
+               return (inet_net_ntop_ipv6(src, bits, dst, size));
        default:
                errno = EAFNOSUPPORT;
                return (NULL);
@@ -100,6 +104,7 @@
                errno = EINVAL;
                return (NULL);
        }
+
        if (bits == 0) {
                if (size < sizeof "0")
                        goto emsgsize;
@@ -144,3 +149,131 @@
        errno = EMSGSIZE;
        return (NULL);
 }
+
+/*
+ * static char *
+ * inet_net_ntop_ipv6(src, bits, fakebits, dst, size)
+ *     convert IPv6 network number from network to presentation format.
+ *     generates CIDR style result always. Picks the shortest representation
+ *     unless the IP is really IPv4.
+ *     always prints specified number of bits (bits).
+ * return:
+ *     pointer to dst, or NULL if an error occurred (check errno).
+ * note:
+ *     network byte order assumed.  this means 192.5.5.240/28 has
+ *     0x11110000 in its fourth octet.
+ * author:
+ *     Vadim Kogan (UCB), June 2001
+ *  Original version (IPv4) by Paul Vixie (ISC), July 1996
+ */
+
+static char *
+inet_net_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size) {
+       u_int   m;
+       int     b;
+       int     p;
+       int     zero_s, zero_l, tmp_zero_s, tmp_zero_l;
+       int     i;
+       int     is_ipv4 = 0;
+       unsigned char inbuf[16];
+       char outbuf[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+       char    *cp;
+       int     words;
+       u_char  *s;
+
+       if (bits < 0 || bits > 128) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       cp = outbuf;
+
+       if (bits == 0) {
+               *cp++ = ':';
+               *cp++ = ':';
+               *cp = '\0';
+       } else {
+               /* Copy src to private buffer.  Zero host part. */      
+               p = (bits + 7) / 8;
+               memcpy(inbuf, src, p);
+               memset(inbuf + p, 0, 16 - p);
+               b = bits % 8;
+               if (b != 0) {
+                       m = ~0 << (8 - b);
+                       inbuf[p-1] &= m;
+               }
+
+               s = inbuf;
+
+               /* how many words need to be displayed in output */
+               words = (bits + 15) / 16;
+               if (words == 1)
+                       words = 2;
+               
+               /* Find the longest substring of zero's */
+               zero_s = zero_l = tmp_zero_s = tmp_zero_l = 0;
+               for (i = 0; i < (words * 2); i += 2) {
+                       if ((s[i] | s[i+1]) == 0) {
+                               if (tmp_zero_l == 0)
+                                       tmp_zero_s = i / 2;
+                               tmp_zero_l++;
+                       } else {
+                               if (tmp_zero_l && zero_l < tmp_zero_l) {
+                                       zero_s = tmp_zero_s;
+                                       zero_l = tmp_zero_l;
+                                       tmp_zero_l = 0;
+                               }
+                       }
+               }
+
+               if (tmp_zero_l && zero_l < tmp_zero_l) {
+                       zero_s = tmp_zero_s;
+                       zero_l = tmp_zero_l;
+               }
+
+               if (zero_l != words && zero_s == 0 && ((zero_l == 6) ||
+                   ((zero_l == 5 && s[10] == 0xff && s[11] == 0xff) ||
+                   ((zero_l == 7 && s[14] != 0 && s[15] != 1)))))
+                       is_ipv4 = 1;
+
+               /* Format whole words. */
+               for (p = 0; p < words; p++) {
+                       if (zero_l != 0 && p >= zero_s && p < zero_s + zero_l) {
+                               /* Time to skip some zeros */
+                               if (p == zero_s)
+                                       *cp++ = ':';
+                               if (p == words - 1)
+                                       *cp++ = ':';
+                               s++;
+                               s++;
+                               continue;
+                       }
+
+                       if (is_ipv4 && p > 5 ) {
+                               *cp++ = (p == 6) ? ':' : '.';
+                               cp += SPRINTF((cp, "%u", *s++));
+                               /* we can potentially drop the last octet */
+                               if (p != 7 || bits > 120) {
+                                       *cp++ = '.';
+                                       cp += SPRINTF((cp, "%u", *s++));
+                               }
+                       } else {
+                               if (cp != outbuf)
+                                       *cp++ = ':';
+                               cp += SPRINTF((cp, "%x", *s * 256 + s[1]));
+                               s += 2;
+                       }
+               }
+       }
+       /* Format CIDR /width. */
+       SPRINTF((cp, "/%u", bits));
+       if (strlen(outbuf) + 1 > size)
+               goto emsgsize;
+       strcpy(dst, outbuf);
+       
+       return (dst);
+
+emsgsize:
+       errno = EMSGSIZE;
+       return (NULL);
+}



Home | Main Index | Thread Index | Old Index