patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			686 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			686 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: lib/libc/net/getaddrinfo.c
 | |
| diff -c lib/libc/net/getaddrinfo.c:1.9.2.9 lib/libc/net/getaddrinfo.c:1.9.2.11
 | |
| *** lib/libc/net/getaddrinfo.c:1.9.2.9	Sun Mar  3 12:45:30 2002
 | |
| --- lib/libc/net/getaddrinfo.c	Sun Sep 22 07:20:23 2002
 | |
| ***************
 | |
| *** 182,192 ****
 | |
|   #define	PTON_MAX	4
 | |
|   #endif
 | |
|   
 | |
| ! #if PACKETSZ > 1024
 | |
| ! #define MAXPACKET	PACKETSZ
 | |
| ! #else
 | |
| ! #define MAXPACKET	1024
 | |
| ! #endif
 | |
|   
 | |
|   typedef union {
 | |
|   	HEADER hdr;
 | |
| --- 182,188 ----
 | |
|   #define	PTON_MAX	4
 | |
|   #endif
 | |
|   
 | |
| ! #define MAXPACKET	(64*1024)
 | |
|   
 | |
|   typedef union {
 | |
|   	HEADER hdr;
 | |
| ***************
 | |
| *** 1407,1413 ****
 | |
|   	struct addrinfo **res;
 | |
|   {
 | |
|   	struct addrinfo *ai;
 | |
| ! 	querybuf buf, buf2;
 | |
|   	const char *name;
 | |
|   	struct addrinfo sentinel, *cur;
 | |
|   	struct res_target q, q2;
 | |
| --- 1403,1409 ----
 | |
|   	struct addrinfo **res;
 | |
|   {
 | |
|   	struct addrinfo *ai;
 | |
| ! 	querybuf *buf, *buf2;
 | |
|   	const char *name;
 | |
|   	struct addrinfo sentinel, *cur;
 | |
|   	struct res_target q, q2;
 | |
| ***************
 | |
| *** 1417,1463 ****
 | |
|   	memset(&sentinel, 0, sizeof(sentinel));
 | |
|   	cur = &sentinel;
 | |
|   
 | |
|   	switch (pai->ai_family) {
 | |
|   	case AF_UNSPEC:
 | |
|   		/* prefer IPv6 */
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_AAAA;
 | |
| ! 		q.answer = buf.buf;
 | |
| ! 		q.anslen = sizeof(buf);
 | |
|   		q.next = &q2;
 | |
|   		q2.qclass = C_IN;
 | |
|   		q2.qtype = T_A;
 | |
| ! 		q2.answer = buf2.buf;
 | |
| ! 		q2.anslen = sizeof(buf2);
 | |
|   		break;
 | |
|   	case AF_INET:
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_A;
 | |
| ! 		q.answer = buf.buf;
 | |
| ! 		q.anslen = sizeof(buf);
 | |
|   		break;
 | |
|   	case AF_INET6:
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_AAAA;
 | |
| ! 		q.answer = buf.buf;
 | |
| ! 		q.anslen = sizeof(buf);
 | |
|   		break;
 | |
|   	default:
 | |
|   		return EAI_FAIL;
 | |
|   	}
 | |
| ! 	if (res_searchN(hostname, &q) < 0)
 | |
|   		return EAI_NODATA;
 | |
| ! 	ai = getanswer(&buf, q.n, q.name, q.qtype, pai);
 | |
|   	if (ai) {
 | |
|   		cur->ai_next = ai;
 | |
|   		while (cur && cur->ai_next)
 | |
|   			cur = cur->ai_next;
 | |
|   	}
 | |
|   	if (q.next) {
 | |
| ! 		ai = getanswer(&buf2, q2.n, q2.name, q2.qtype, pai);
 | |
|   		if (ai)
 | |
|   			cur->ai_next = ai;
 | |
|   	}
 | |
|   	if (sentinel.ai_next == NULL)
 | |
|   		switch (h_errno) {
 | |
|   		case HOST_NOT_FOUND:
 | |
| --- 1413,1478 ----
 | |
|   	memset(&sentinel, 0, sizeof(sentinel));
 | |
|   	cur = &sentinel;
 | |
|   
 | |
| + 	buf = malloc(sizeof(*buf));
 | |
| + 	if (!buf) {
 | |
| + 		h_errno = NETDB_INTERNAL;
 | |
| + 		return EAI_MEMORY;
 | |
| + 	}
 | |
| + 	buf2 = malloc(sizeof(*buf2));
 | |
| + 	if (!buf2) {
 | |
| + 		free(buf);
 | |
| + 		h_errno = NETDB_INTERNAL;
 | |
| + 		return EAI_MEMORY;
 | |
| + 	}
 | |
| + 
 | |
|   	switch (pai->ai_family) {
 | |
|   	case AF_UNSPEC:
 | |
|   		/* prefer IPv6 */
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_AAAA;
 | |
| ! 		q.answer = buf->buf;
 | |
| ! 		q.anslen = sizeof(buf->buf);
 | |
|   		q.next = &q2;
 | |
|   		q2.qclass = C_IN;
 | |
|   		q2.qtype = T_A;
 | |
| ! 		q2.answer = buf2->buf;
 | |
| ! 		q2.anslen = sizeof(buf2->buf);
 | |
|   		break;
 | |
|   	case AF_INET:
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_A;
 | |
| ! 		q.answer = buf->buf;
 | |
| ! 		q.anslen = sizeof(buf->buf);
 | |
|   		break;
 | |
|   	case AF_INET6:
 | |
|   		q.qclass = C_IN;
 | |
|   		q.qtype = T_AAAA;
 | |
| ! 		q.answer = buf->buf;
 | |
| ! 		q.anslen = sizeof(buf->buf);
 | |
|   		break;
 | |
|   	default:
 | |
| + 		free(buf);
 | |
| + 		free(buf2);
 | |
|   		return EAI_FAIL;
 | |
|   	}
 | |
| ! 	if (res_searchN(hostname, &q) < 0) {
 | |
| ! 		free(buf);
 | |
| ! 		free(buf2);
 | |
|   		return EAI_NODATA;
 | |
| ! 	}
 | |
| ! 	ai = getanswer(buf, q.n, q.name, q.qtype, pai);
 | |
|   	if (ai) {
 | |
|   		cur->ai_next = ai;
 | |
|   		while (cur && cur->ai_next)
 | |
|   			cur = cur->ai_next;
 | |
|   	}
 | |
|   	if (q.next) {
 | |
| ! 		ai = getanswer(buf2, q2.n, q2.name, q2.qtype, pai);
 | |
|   		if (ai)
 | |
|   			cur->ai_next = ai;
 | |
|   	}
 | |
| + 	free(buf);
 | |
| + 	free(buf2);
 | |
|   	if (sentinel.ai_next == NULL)
 | |
|   		switch (h_errno) {
 | |
|   		case HOST_NOT_FOUND:
 | |
| ***************
 | |
| *** 1662,1668 ****
 | |
|   	const char *name;	/* domain name */
 | |
|   	struct res_target *target;
 | |
|   {
 | |
| ! 	u_char buf[MAXPACKET];
 | |
|   	HEADER *hp;
 | |
|   	int n;
 | |
|   	struct res_target *t;
 | |
| --- 1677,1683 ----
 | |
|   	const char *name;	/* domain name */
 | |
|   	struct res_target *target;
 | |
|   {
 | |
| ! 	u_char *buf;
 | |
|   	HEADER *hp;
 | |
|   	int n;
 | |
|   	struct res_target *t;
 | |
| ***************
 | |
| *** 1677,1682 ****
 | |
| --- 1692,1703 ----
 | |
|   		return (-1);
 | |
|   	}
 | |
|   
 | |
| + 	buf = malloc(MAXPACKET);
 | |
| + 	if (!buf) {
 | |
| + 		h_errno = NETDB_INTERNAL;
 | |
| + 		return (-1);
 | |
| + 	}
 | |
| + 
 | |
|   	for (t = target; t; t = t->next) {
 | |
|   		int class, type;
 | |
|   		u_char *answer;
 | |
| ***************
 | |
| *** 1696,1709 ****
 | |
|   #endif
 | |
|   
 | |
|   		n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
 | |
| ! 		    buf, sizeof(buf));
 | |
|   		if (n > 0 && (_res.options & RES_USE_EDNS0) != 0)
 | |
| ! 			n = res_opt(n, buf, sizeof(buf), anslen);
 | |
|   		if (n <= 0) {
 | |
|   #ifdef DEBUG
 | |
|   			if (_res.options & RES_DEBUG)
 | |
|   				printf(";; res_query: mkquery failed\n");
 | |
|   #endif
 | |
|   			h_errno = NO_RECOVERY;
 | |
|   			return (n);
 | |
|   		}
 | |
| --- 1717,1731 ----
 | |
|   #endif
 | |
|   
 | |
|   		n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
 | |
| ! 		    buf, MAXPACKET);
 | |
|   		if (n > 0 && (_res.options & RES_USE_EDNS0) != 0)
 | |
| ! 			n = res_opt(n, buf, MAXPACKET, anslen);
 | |
|   		if (n <= 0) {
 | |
|   #ifdef DEBUG
 | |
|   			if (_res.options & RES_DEBUG)
 | |
|   				printf(";; res_query: mkquery failed\n");
 | |
|   #endif
 | |
| + 			free(buf);
 | |
|   			h_errno = NO_RECOVERY;
 | |
|   			return (n);
 | |
|   		}
 | |
| ***************
 | |
| *** 1714,1725 ****
 | |
|   			if (_res.options & RES_DEBUG)
 | |
|   				printf(";; res_query: send error\n");
 | |
|   #endif
 | |
|   			h_errno = TRY_AGAIN;
 | |
|   			return (n);
 | |
|   		}
 | |
|   #endif
 | |
|   
 | |
| ! 		if (n < 0 || hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
 | |
|   			rcode = hp->rcode;	/* record most recent error */
 | |
|   #ifdef DEBUG
 | |
|   			if (_res.options & RES_DEBUG)
 | |
| --- 1736,1750 ----
 | |
|   			if (_res.options & RES_DEBUG)
 | |
|   				printf(";; res_query: send error\n");
 | |
|   #endif
 | |
| + 			free(buf);
 | |
|   			h_errno = TRY_AGAIN;
 | |
|   			return (n);
 | |
|   		}
 | |
|   #endif
 | |
|   
 | |
| ! 		if (n < 0 || n > anslen)
 | |
| ! 			hp->rcode = FORMERR; /* XXX not very informative */
 | |
| ! 		if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
 | |
|   			rcode = hp->rcode;	/* record most recent error */
 | |
|   #ifdef DEBUG
 | |
|   			if (_res.options & RES_DEBUG)
 | |
| ***************
 | |
| *** 1733,1738 ****
 | |
| --- 1758,1765 ----
 | |
|   
 | |
|   		t->n = n;
 | |
|   	}
 | |
| + 
 | |
| + 	free(buf);
 | |
|   
 | |
|   	if (ancount == 0) {
 | |
|   		switch (rcode) {
 | |
| Index: lib/libc/net/gethostbydns.c
 | |
| diff -c lib/libc/net/gethostbydns.c:1.27.2.2 lib/libc/net/gethostbydns.c:1.27.2.3
 | |
| *** lib/libc/net/gethostbydns.c:1.27.2.2	Wed Jun 26 01:24:29 2002
 | |
| --- lib/libc/net/gethostbydns.c	Thu Sep 19 08:45:23 2002
 | |
| ***************
 | |
| *** 584,591 ****
 | |
|   				break;
 | |
|   		}
 | |
|   
 | |
| ! 	if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf))) < 0) {
 | |
|   		dprintf("res_search failed (%d)\n", n);
 | |
|   		return (NULL);
 | |
|   	}
 | |
|   	return (gethostanswer(&buf, n, name, type));
 | |
| --- 584,595 ----
 | |
|   				break;
 | |
|   		}
 | |
|   
 | |
| ! 	n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf));
 | |
| ! 	if (n < 0) {
 | |
|   		dprintf("res_search failed (%d)\n", n);
 | |
| + 		return (NULL);
 | |
| + 	} else if (n > sizeof(buf.buf)) {
 | |
| + 		dprintf("static buffer is too small (%d)\n", n);
 | |
|   		return (NULL);
 | |
|   	}
 | |
|   	return (gethostanswer(&buf, n, name, type));
 | |
| Index: lib/libc/net/getnetbydns.c
 | |
| diff -c lib/libc/net/getnetbydns.c:1.13.2.2 lib/libc/net/getnetbydns.c:1.13.2.3
 | |
| *** lib/libc/net/getnetbydns.c:1.13.2.2	Wed Jun 26 01:34:18 2002
 | |
| --- lib/libc/net/getnetbydns.c	Thu Sep 19 08:45:23 2002
 | |
| ***************
 | |
| *** 256,262 ****
 | |
|   	if (anslen < 0) {
 | |
|   #ifdef DEBUG
 | |
|   		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_query failed\n");
 | |
|   #endif
 | |
|   		return (NULL);
 | |
|   	}
 | |
| --- 256,268 ----
 | |
|   	if (anslen < 0) {
 | |
|   #ifdef DEBUG
 | |
|   		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_search failed\n");
 | |
| ! #endif
 | |
| ! 		return (NULL);
 | |
| ! 	} else if (anslen > sizeof(buf)) {
 | |
| ! #ifdef DEBUG
 | |
| ! 		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_search static buffer too small\n");
 | |
|   #endif
 | |
|   		return (NULL);
 | |
|   	}
 | |
| ***************
 | |
| *** 291,297 ****
 | |
|   	if (anslen < 0) {
 | |
|   #ifdef DEBUG
 | |
|   		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_query failed\n");
 | |
|   #endif
 | |
|   		return (NULL);
 | |
|   	}
 | |
| --- 297,309 ----
 | |
|   	if (anslen < 0) {
 | |
|   #ifdef DEBUG
 | |
|   		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_search failed\n");
 | |
| ! #endif
 | |
| ! 		return (NULL);
 | |
| ! 	} else if (anslen > sizeof(buf)) {
 | |
| ! #ifdef DEBUG
 | |
| ! 		if (_res.options & RES_DEBUG)
 | |
| ! 			printf("res_search static buffer too small\n");
 | |
|   #endif
 | |
|   		return (NULL);
 | |
|   	}
 | |
| Index: lib/libc/net/name6.c
 | |
| diff -c lib/libc/net/name6.c:1.6.2.6 lib/libc/net/name6.c:1.6.2.7
 | |
| *** lib/libc/net/name6.c:1.6.2.6	Wed Jun 26 01:06:43 2002
 | |
| --- lib/libc/net/name6.c	Thu Sep 19 08:45:23 2002
 | |
| ***************
 | |
| *** 994,1004 ****
 | |
|           int     rtl_type;
 | |
|   };
 | |
|   
 | |
| ! #if PACKETSZ > 1024
 | |
| ! #define	MAXPACKET	PACKETSZ
 | |
| ! #else
 | |
| ! #define	MAXPACKET	1024
 | |
| ! #endif
 | |
|   
 | |
|   typedef union {
 | |
|   	HEADER hdr;
 | |
| --- 994,1000 ----
 | |
|           int     rtl_type;
 | |
|   };
 | |
|   
 | |
| ! #define	MAXPACKET	(64*1024)
 | |
|   
 | |
|   typedef union {
 | |
|   	HEADER hdr;
 | |
| ***************
 | |
| *** 1305,1311 ****
 | |
|   	int trailing_dot, ret, saved_herrno;
 | |
|   	int got_nodata = 0, got_servfail = 0, tried_as_is = 0;
 | |
|   	struct __res_type_list *rtl0 = rtl;
 | |
| ! 	querybuf buf;
 | |
|   
 | |
|   	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
 | |
|   		*errp = NETDB_INTERNAL;
 | |
| --- 1301,1307 ----
 | |
|   	int trailing_dot, ret, saved_herrno;
 | |
|   	int got_nodata = 0, got_servfail = 0, tried_as_is = 0;
 | |
|   	struct __res_type_list *rtl0 = rtl;
 | |
| ! 	querybuf *buf;
 | |
|   
 | |
|   	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
 | |
|   		*errp = NETDB_INTERNAL;
 | |
| ***************
 | |
| *** 1318,1334 ****
 | |
|   	if (cp > name && *--cp == '.')
 | |
|   		trailing_dot++;
 | |
|   
 | |
|   	/* If there aren't any dots, it could be a user-level alias */
 | |
|   	if (!dots && (cp = hostalias(name)) != NULL) {
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
| ! 			ret = res_query(cp, C_IN, rtl->rtl_type, buf.buf,
 | |
| ! 					     sizeof(buf.buf));
 | |
| ! 			if (ret > 0) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(&buf, ret, name, rtl->rtl_type,
 | |
|   						    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| --- 1314,1336 ----
 | |
|   	if (cp > name && *--cp == '.')
 | |
|   		trailing_dot++;
 | |
|   
 | |
| + 	buf = malloc(sizeof(*buf));
 | |
| + 	if (buf == NULL) {
 | |
| + 		*errp = NETDB_INTERNAL;
 | |
| + 		return NULL;
 | |
| + 	}
 | |
| + 
 | |
|   	/* If there aren't any dots, it could be a user-level alias */
 | |
|   	if (!dots && (cp = hostalias(name)) != NULL) {
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
| ! 			ret = res_query(cp, C_IN, rtl->rtl_type, buf->buf,
 | |
| ! 					     sizeof(buf->buf));
 | |
| ! 			if (ret > 0 && ret < sizeof(buf->buf)) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(buf, ret, name, rtl->rtl_type,
 | |
|   						    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| ***************
 | |
| *** 1336,1341 ****
 | |
| --- 1338,1344 ----
 | |
|   				hp0 = _hpmerge(hp0, hp, errp);
 | |
|   			}
 | |
|   		}
 | |
| + 		free(buf);
 | |
|   		return (hp0);
 | |
|   	}
 | |
|   
 | |
| ***************
 | |
| *** 1348,1359 ****
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   			ret = res_querydomain(name, NULL, C_IN, rtl->rtl_type,
 | |
| ! 					      buf.buf, sizeof(buf.buf));
 | |
| ! 			if (ret > 0) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(&buf, ret, name, rtl->rtl_type,
 | |
|   						    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| --- 1351,1362 ----
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   			ret = res_querydomain(name, NULL, C_IN, rtl->rtl_type,
 | |
| ! 					      buf->buf, sizeof(buf->buf));
 | |
| ! 			if (ret > 0 && ret < sizeof(buf->buf)) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(buf, ret, name, rtl->rtl_type,
 | |
|   						    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| ***************
 | |
| *** 1361,1368 ****
 | |
|   				hp0 = _hpmerge(hp0, hp, errp);
 | |
|   			}
 | |
|   		}
 | |
| ! 		if (hp0 != NULL)
 | |
|   			return (hp0);
 | |
|   		saved_herrno = *errp;
 | |
|   		tried_as_is++;
 | |
|   	}
 | |
| --- 1364,1373 ----
 | |
|   				hp0 = _hpmerge(hp0, hp, errp);
 | |
|   			}
 | |
|   		}
 | |
| ! 		if (hp0 != NULL) {
 | |
| ! 			free(buf);
 | |
|   			return (hp0);
 | |
| + 		}
 | |
|   		saved_herrno = *errp;
 | |
|   		tried_as_is++;
 | |
|   	}
 | |
| ***************
 | |
| *** 1385,1396 ****
 | |
|   			    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   				ret = res_querydomain(name, *domain, C_IN,
 | |
|   						      rtl->rtl_type,
 | |
| ! 						      buf.buf, sizeof(buf.buf));
 | |
| ! 				if (ret > 0) {
 | |
|   					hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   					    ? AF_INET6 : AF_INET;
 | |
|   					hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 					hp = getanswer(&buf, ret, name,
 | |
|   					    rtl->rtl_type, &hpbuf, errp);
 | |
|   					if (!hp)
 | |
|   						continue;
 | |
| --- 1390,1401 ----
 | |
|   			    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   				ret = res_querydomain(name, *domain, C_IN,
 | |
|   						      rtl->rtl_type,
 | |
| ! 						      buf->buf, sizeof(buf->buf));
 | |
| ! 				if (ret > 0 && ret < sizeof(buf->buf)) {
 | |
|   					hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   					    ? AF_INET6 : AF_INET;
 | |
|   					hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 					hp = getanswer(buf, ret, name,
 | |
|   					    rtl->rtl_type, &hpbuf, errp);
 | |
|   					if (!hp)
 | |
|   						continue;
 | |
| ***************
 | |
| *** 1398,1405 ****
 | |
|   					hp0 = _hpmerge(hp0, hp, errp);
 | |
|   				}
 | |
|   			}
 | |
| ! 			if (hp0 != NULL)
 | |
|   				return (hp0);
 | |
|   
 | |
|   			/*
 | |
|   			 * If no server present, give up.
 | |
| --- 1403,1412 ----
 | |
|   					hp0 = _hpmerge(hp0, hp, errp);
 | |
|   				}
 | |
|   			}
 | |
| ! 			if (hp0 != NULL) {
 | |
| ! 				free(buf);
 | |
|   				return (hp0);
 | |
| + 			}
 | |
|   
 | |
|   			/*
 | |
|   			 * If no server present, give up.
 | |
| ***************
 | |
| *** 1415,1420 ****
 | |
| --- 1422,1428 ----
 | |
|   			 * fully-qualified.
 | |
|   			 */
 | |
|   			if (errno == ECONNREFUSED) {
 | |
| + 				free(buf);
 | |
|   				*errp = TRY_AGAIN;
 | |
|   				return (NULL);
 | |
|   			}
 | |
| ***************
 | |
| *** 1427,1433 ****
 | |
|   				/* keep trying */
 | |
|   				break;
 | |
|   			case TRY_AGAIN:
 | |
| ! 				if (buf.hdr.rcode == SERVFAIL) {
 | |
|   					/* try next search element, if any */
 | |
|   					got_servfail++;
 | |
|   					break;
 | |
| --- 1435,1441 ----
 | |
|   				/* keep trying */
 | |
|   				break;
 | |
|   			case TRY_AGAIN:
 | |
| ! 				if (buf->hdr.rcode == SERVFAIL) {
 | |
|   					/* try next search element, if any */
 | |
|   					got_servfail++;
 | |
|   					break;
 | |
| ***************
 | |
| *** 1455,1466 ****
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   			ret = res_querydomain(name, NULL, C_IN, rtl->rtl_type,
 | |
| ! 					      buf.buf, sizeof(buf.buf));
 | |
| ! 			if (ret > 0) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(&buf, ret, name, rtl->rtl_type,
 | |
|   				    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| --- 1463,1474 ----
 | |
|   		for(rtl = rtl0; rtl != NULL;
 | |
|   		    rtl = SLIST_NEXT(rtl, rtl_entry)) {
 | |
|   			ret = res_querydomain(name, NULL, C_IN, rtl->rtl_type,
 | |
| ! 					      buf->buf, sizeof(buf->buf));
 | |
| ! 			if (ret > 0 && ret < sizeof(buf->buf)) {
 | |
|   				hpbuf.h_addrtype = (rtl->rtl_type == T_AAAA)
 | |
|   				    ? AF_INET6 : AF_INET;
 | |
|   				hpbuf.h_length = ADDRLEN(hpbuf.h_addrtype);
 | |
| ! 				hp = getanswer(buf, ret, name, rtl->rtl_type,
 | |
|   				    &hpbuf, errp);
 | |
|   				if (!hp)
 | |
|   					continue;
 | |
| ***************
 | |
| *** 1468,1477 ****
 | |
|   				hp0 = _hpmerge(hp0, hp, errp);
 | |
|   			}
 | |
|   		}
 | |
| ! 		if (hp0 != NULL)
 | |
|   			return (hp0);
 | |
|   	}
 | |
|   
 | |
|   	/* if we got here, we didn't satisfy the search.
 | |
|   	 * if we did an initial full query, return that query's h_errno
 | |
|   	 * (note that we wouldn't be here if that query had succeeded).
 | |
| --- 1476,1489 ----
 | |
|   				hp0 = _hpmerge(hp0, hp, errp);
 | |
|   			}
 | |
|   		}
 | |
| ! 		if (hp0 != NULL) {
 | |
| ! 			free(buf);
 | |
|   			return (hp0);
 | |
| + 		}
 | |
|   	}
 | |
|   
 | |
| + 	free(buf);
 | |
| + 
 | |
|   	/* if we got here, we didn't satisfy the search.
 | |
|   	 * if we did an initial full query, return that query's h_errno
 | |
|   	 * (note that we wouldn't be here if that query had succeeded).
 | |
| ***************
 | |
| *** 1531,1537 ****
 | |
|   #ifdef INET6
 | |
|   	static const char hex[] = "0123456789abcdef";
 | |
|   #endif
 | |
| ! 	querybuf buf;
 | |
|   	char qbuf[MAXDNAME+1];
 | |
|   	char *hlist[2];
 | |
|   
 | |
| --- 1543,1549 ----
 | |
|   #ifdef INET6
 | |
|   	static const char hex[] = "0123456789abcdef";
 | |
|   #endif
 | |
| ! 	querybuf *buf;
 | |
|   	char qbuf[MAXDNAME+1];
 | |
|   	char *hlist[2];
 | |
|   
 | |
| ***************
 | |
| *** 1584,1595 ****
 | |
|   		break;
 | |
|   	}
 | |
|   
 | |
| ! 	n = res_query(qbuf, C_IN, T_PTR, buf.buf, sizeof buf.buf);
 | |
|   	if (n < 0) {
 | |
|   		*errp = h_errno;
 | |
|   		return NULL;
 | |
|   	}
 | |
| ! 	hp = getanswer(&buf, n, qbuf, T_PTR, &hbuf, errp);
 | |
|   	if (!hp)
 | |
|   		return NULL;
 | |
|   	hbuf.h_addrtype = af;
 | |
| --- 1596,1622 ----
 | |
|   		break;
 | |
|   	}
 | |
|   
 | |
| ! 	buf = malloc(sizeof(*buf));
 | |
| ! 	if (buf == NULL) {
 | |
| ! 		*errp = NETDB_INTERNAL;
 | |
| ! 		return NULL;
 | |
| ! 	}
 | |
| ! 
 | |
| ! 	n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
 | |
|   	if (n < 0) {
 | |
| + 		free(buf);
 | |
|   		*errp = h_errno;
 | |
|   		return NULL;
 | |
| + 	} else if (n > sizeof(buf->buf)) {
 | |
| + 		free(buf);
 | |
| + 		*errp = NETDB_INTERNAL;
 | |
| + #if 0
 | |
| + 		errno = ERANGE; /* XXX is it OK to set errno here? */
 | |
| + #endif
 | |
| + 		return NULL;
 | |
|   	}
 | |
| ! 	hp = getanswer(buf, n, qbuf, T_PTR, &hbuf, errp);
 | |
| ! 	free(buf);
 | |
|   	if (!hp)
 | |
|   		return NULL;
 | |
|   	hbuf.h_addrtype = af;
 | |
| Index: lib/libc/net/res_mkquery.c
 | |
| diff -c lib/libc/net/res_mkquery.c:1.15.2.1 lib/libc/net/res_mkquery.c:1.15.2.2
 | |
| *** lib/libc/net/res_mkquery.c:1.15.2.1	Fri Jun 15 17:08:28 2001
 | |
| --- lib/libc/net/res_mkquery.c	Fri Sep 20 05:45:35 2002
 | |
| ***************
 | |
| *** 228,233 ****
 | |
| --- 228,235 ----
 | |
|   
 | |
|   	__putshort(T_OPT, cp);	/* TYPE */
 | |
|   	cp += INT16SZ;
 | |
| + 	if (anslen > 0xffff)
 | |
| + 		anslen = 0xffff;		/* limit to 16bit value */
 | |
|   	__putshort(anslen & 0xffff, cp);	/* CLASS = UDP payload size */
 | |
|   	cp += INT16SZ;
 | |
|   	*cp++ = NOERROR;	/* extended RCODE */
 |