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/irs Pull up revisions 1.2-1.3 (requested ...



details:   https://anonhg.NetBSD.org/src/rev/7da90d5198e4
branches:  netbsd-1-6
changeset: 528202:7da90d5198e4
user:      lukem <lukem%NetBSD.org@localhost>
date:      Fri Jun 28 11:47:53 2002 +0000

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

diffstat:

 dist/bind/lib/irs/getaddrinfo.c |  1581 ++++++++++++++++++++++++++++----------
 1 files changed, 1147 insertions(+), 434 deletions(-)

diffs (truncated from 1658 to 300 lines):

diff -r a87329dfb78e -r 7da90d5198e4 dist/bind/lib/irs/getaddrinfo.c
--- a/dist/bind/lib/irs/getaddrinfo.c   Fri Jun 28 11:47:27 2002 +0000
+++ b/dist/bind/lib/irs/getaddrinfo.c   Fri Jun 28 11:47:53 2002 +0000
@@ -1,507 +1,1220 @@
-/*     $NetBSD: getaddrinfo.c,v 1.1.1.1 1999/11/20 18:54:08 veego Exp $        */
+/*     $NetBSD: getaddrinfo.c,v 1.1.1.1.10.1 2002/06/28 11:47:53 lukem Exp $   */
+
+/*     $KAME: getaddrinfo.c,v 1.14 2001/01/06 09:41:15 jinmei Exp $    */
 
-/*-
- * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved.
- * The Berkeley Software Design Inc. software License Agreement specifies
- * the terms and conditions for redistribution.
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
  *
- *     BSDI Id: getaddrinfo.c,v 8.3 1999/06/11 01:25:58 vixie Exp
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
-#include <port_before.h>
+/*
+ * Issues to be discussed:
+ * - Thread safe-ness must be checked.
+ * - Return values.  There are nonstandard return values defined and used
+ *   in the source code.  This is because RFC2553 is silent about which error
+ *   code must be returned for which situation.
+ * - IPv4 classful (shortened) form.  RFC2553 is silent about it.  XNET 5.2
+ *   says to use inet_aton() to convert IPv4 numeric to binary (allows
+ *   classful form as a result).
+ *   current code - disallow classful form for IPv4 (due to use of inet_pton).
+ * - freeaddrinfo(NULL).  RFC2553 is silent about it.  XNET 5.2 says it is
+ *   invalid.
+ *   current code - SEGV on freeaddrinfo(NULL)
+ * Note:
+ * - We use getipnodebyname() just for thread-safeness.  There's no intent
+ *   to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to
+ *   getipnodebyname().
+ * - The code filters out AFs that are not supported by the kernel,
+ *   when globbing NULL hostname (to loopback, or wildcard).  Is it the right
+ *   thing to do?  What is the relationship with post-RFC2553 AI_ADDRCONFIG
+ *   in ai_flags?
+ * - (post-2553) semantics of AI_ADDRCONFIG itself is too vague.
+ *   (1) what should we do against numeric hostname (2) what should we do
+ *   against NULL hostname (3) what is AI_ADDRCONFIG itself.  AF not ready?
+ *   non-loopback address configured?  global address configured?
+ * - To avoid search order issue, we have a big amount of code duplicate
+ *   from gethnamaddr.c and some other places.  The issues that there's no
+ *   lower layer function to lookup "IPv4 or IPv6" record.  Calling
+ *   gethostbyname2 from getaddrinfo will end up in wrong search order, as
+ *   follows:
+ *     - The code makes use of following calls when asked to resolver with
+ *       ai_family  = PF_UNSPEC:
+ *             getipnodebyname(host, AF_INET6);
+ *             getipnodebyname(host, AF_INET);
+ *       This will result in the following queries if the node is configure to
+ *       prefer /etc/hosts than DNS:
+ *             lookup /etc/hosts for IPv6 address
+ *             lookup DNS for IPv6 address
+ *             lookup /etc/hosts for IPv4 address
+ *             lookup DNS for IPv4 address
+ *       which may not meet people's requirement.
+ *       The right thing to happen is to have underlying layer which does
+ *       PF_UNSPEC lookup (lookup both) and return chain of addrinfos.
+ *       This would result in a bit of code duplicate with _dns_ghbyname() and
+ *       friends.
+ */
+
+#include "port_before.h"
+
+#include <sys/types.h>
 #include <sys/param.h>
 #include <sys/socket.h>
-#include <sys/un.h>
+
+#include <net/if.h>
 #include <netinet/in.h>
+
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+
 #include <netdb.h>
-#include <errno.h>
+#include <resolv.h>
 #include <string.h>
 #include <stdlib.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <arpa/inet.h>
-#include <port_after.h>
+#include <stddef.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include <stdarg.h>
+
+#include <irs.h>
+
+#include "port_after.h"
+
+#include "irs_data.h"
+
+/*
+ * if we enable it, we will see duplicated addrinfo entries on reply if both
+ * AAAA and A6 records are found.  disable it for default installation.
+ */
+#undef T_A6
+
+#define SUCCESS 0
+#define ANY 0
+#define YES 1
+#define NO  0
+
+static const char in_addrany[] = { 0, 0, 0, 0 };
+static const char in6_addrany[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+static const char in_loopback[] = { 127, 0, 0, 1 };
+static const char in6_loopback[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
+};
+
+static const struct afd {
+       int a_af;
+       int a_addrlen;
+       int a_socklen;
+       int a_off;
+       const char *a_addrany;
+       const char *a_loopback;
+       int a_scoped;
+} afdl [] = {
+       {PF_INET6, sizeof(struct in6_addr),
+        sizeof(struct sockaddr_in6),
+        offsetof(struct sockaddr_in6, sin6_addr),
+        in6_addrany, in6_loopback, 1},
+       {PF_INET, sizeof(struct in_addr),
+        sizeof(struct sockaddr_in),
+        offsetof(struct sockaddr_in, sin_addr),
+        in_addrany, in_loopback, 0},
+       {0, 0, 0, 0, NULL, NULL, 0},
+};
 
-#define SA(addr)       ((struct sockaddr *)(addr))
-#define SIN(addr)      ((struct sockaddr_in *)(addr))
-#define SIN6(addr)     ((struct sockaddr_in6 *)(addr))
-#define SUN(addr)      ((struct sockaddr_un *)(addr))
+struct explore {
+       int e_af;
+       int e_socktype;
+       int e_protocol;
+       const char *e_protostr;
+       int e_wild;
+#define WILD_AF(ex)            ((ex)->e_wild & 0x01)
+#define WILD_SOCKTYPE(ex)      ((ex)->e_wild & 0x02)
+#define WILD_PROTOCOL(ex)      ((ex)->e_wild & 0x04)
+};
+
+static const struct explore explore[] = {
+#if 0
+       { PF_LOCAL, 0, ANY, ANY, NULL, 0x01 },
+#endif
+       { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 },
+       { PF_INET6, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 },
+       { PF_INET6, SOCK_RAW, ANY, NULL, 0x05 },
+       { PF_INET, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 },
+       { PF_INET, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 },
+       { PF_INET, SOCK_RAW, ANY, NULL, 0x05 },
+       { -1, 0, 0, NULL, 0 },
+};
+
+#define PTON_MAX       16
 
-static struct addrinfo
-       *ai_reverse(struct addrinfo *oai),
-       *ai_clone(struct addrinfo *oai, int family),
-       *ai_alloc(int family, int addrlen);
-#ifdef AF_LOCAL
-static int get_local(const char *name, int socktype, struct addrinfo **res);
+static int str_isnumber __P((const char *));
+static int explore_fqdn __P((const struct addrinfo *, const char *,
+       const char *, struct addrinfo **));
+static int explore_copy __P((const struct addrinfo *, const struct addrinfo *,
+       struct addrinfo **));
+static int explore_null __P((const struct addrinfo *,
+       const char *, struct addrinfo **));
+static int explore_numeric __P((const struct addrinfo *, const char *,
+       const char *, struct addrinfo **));
+static int explore_numeric_scope __P((const struct addrinfo *, const char *,
+       const char *, struct addrinfo **));
+static int get_canonname __P((const struct addrinfo *,
+       struct addrinfo *, const char *));
+static struct addrinfo *get_ai __P((const struct addrinfo *,
+       const struct afd *, const char *));
+static struct addrinfo *copy_ai __P((const struct addrinfo *));
+static int get_portmatch __P((const struct addrinfo *, const char *));
+static int get_port __P((const struct addrinfo *, const char *, int));
+static const struct afd *find_afd __P((int));
+static int addrconfig __P((int));
+static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *));
+static struct net_data *init __P((void));
+
+struct addrinfo *hostent2addrinfo __P((struct hostent *,
+                                      const struct addrinfo *));
+struct addrinfo *addr2addrinfo __P((const struct addrinfo *,
+                                   const char *));
+
+#if 0
+static const char *ai_errlist[] = {
+       "Success",
+       "Address family for hostname not supported",    /* EAI_ADDRFAMILY */
+       "Temporary failure in name resolution",         /* EAI_AGAIN      */
+       "Invalid value for ai_flags",                   /* EAI_BADFLAGS   */
+       "Non-recoverable failure in name resolution",   /* EAI_FAIL       */
+       "ai_family not supported",                      /* EAI_FAMILY     */
+       "Memory allocation failure",                    /* EAI_MEMORY     */
+       "No address associated with hostname",          /* EAI_NODATA     */
+       "hostname nor servname provided, or not known", /* EAI_NONAME     */
+       "servname not supported for ai_socktype",       /* EAI_SERVICE    */
+       "ai_socktype not supported",                    /* EAI_SOCKTYPE   */
+       "System error returned in errno",               /* EAI_SYSTEM     */
+       "Invalid value for hints",                      /* EAI_BADHINTS   */
+       "Resolved protocol is unknown",                 /* EAI_PROTOCOL   */
+       "Unknown error",                                /* EAI_MAX        */
+};
 #endif
 
-static int add_ipv4(const char *hostname, int flags, struct addrinfo **aip,
-    int socktype, int port);
-static int add_ipv6(const char *hostname, int flags, struct addrinfo **aip,
-    int socktype, int port);
-static void set_order(int, int (**)());
+/* XXX macros that make external reference is BAD. */
+
+#define GET_AI(ai, afd, addr) \
+do { \
+       /* external reference: pai, error, and label free */ \
+       (ai) = get_ai(pai, (afd), (addr)); \
+       if ((ai) == NULL) { \
+               error = EAI_MEMORY; \
+               goto free; \
+       } \
+} while (/*CONSTCOND*/0)
+
+#define GET_PORT(ai, serv) \
+do { \
+       /* external reference: error and label free */ \
+       error = get_port((ai), (serv), 0); \
+       if (error != 0) \
+               goto free; \
+} while (/*CONSTCOND*/0)
+
+#define GET_CANONNAME(ai, str) \
+do { \
+       /* external reference: pai, error and label free */ \
+       error = get_canonname(pai, (ai), (str)); \
+       if (error != 0) \
+               goto free; \
+} while (/*CONSTCOND*/0)
+
+#define ERR(err) \
+do { \
+       /* external reference: error, and label bad */ \
+       error = (err); \
+       goto bad; \
+       /*NOTREACHED*/ \
+} while (/*CONSTCOND*/0)
+
+#define MATCH_FAMILY(x, y, w) \
+       ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == PF_UNSPEC || (y) == PF_UNSPEC)))
+#define MATCH(x, y, w) \
+       ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == ANY || (y) == ANY)))
 
-#define FOUND_IPV4     0x1
-#define FOUND_IPV6     0x2
-#define FOUND_MAX      2



Home | Main Index | Thread Index | Old Index