res_send.c revision 292250
1/*
2 * Portions Copyright (C) 2004-2009  Internet Systems Consortium, Inc. ("ISC")
3 * Portions Copyright (C) 1996-2003  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/*
19 * Copyright (c) 1985, 1989, 1993
20 *    The Regents of the University of California.  All rights reserved.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the above copyright
26 *    notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 *    notice, this list of conditions and the following disclaimer in the
29 *    documentation and/or other materials provided with the distribution.
30 * 4. Neither the name of the University nor the names of its contributors
31 *    may be used to endorse or promote products derived from this software
32 *    without specific prior written permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
35 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
45 */
46
47/*
48 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
49 *
50 * Permission to use, copy, modify, and distribute this software for any
51 * purpose with or without fee is hereby granted, provided that the above
52 * copyright notice and this permission notice appear in all copies, and that
53 * the name of Digital Equipment Corporation not be used in advertising or
54 * publicity pertaining to distribution of the document or software without
55 * specific, written prior permission.
56 *
57 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
58 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
59 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
60 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
61 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
62 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
63 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
64 * SOFTWARE.
65 */
66
67#if defined(LIBC_SCCS) && !defined(lint)
68static const char sccsid[] = "@(#)res_send.c	8.1 (Berkeley) 6/4/93";
69static const char rcsid[] = "$Id: res_send.c,v 1.22 2009/01/22 23:49:23 tbox Exp $";
70#endif /* LIBC_SCCS and not lint */
71#include <sys/cdefs.h>
72__FBSDID("$FreeBSD: head/lib/libc/resolv/res_send.c 292250 2015-12-15 05:37:09Z ngie $");
73
74/*! \file
75 * \brief
76 * Send query to name server and wait for reply.
77 */
78
79#include "port_before.h"
80#if !defined(USE_KQUEUE) && !defined(USE_POLL)
81#include "fd_setsize.h"
82#endif
83
84#include "namespace.h"
85#include <sys/types.h>
86#include <sys/param.h>
87#include <sys/time.h>
88#include <sys/socket.h>
89#include <sys/uio.h>
90
91#include <netinet/in.h>
92#include <arpa/nameser.h>
93#include <arpa/inet.h>
94
95#include <errno.h>
96#include <netdb.h>
97#include <resolv.h>
98#include <signal.h>
99#include <stdio.h>
100#include <stdlib.h>
101#include <string.h>
102#include <unistd.h>
103
104#include <isc/eventlib.h>
105
106#include "port_after.h"
107
108#ifdef USE_KQUEUE
109#include <sys/event.h>
110#else
111#ifdef USE_POLL
112#ifdef HAVE_STROPTS_H
113#include <stropts.h>
114#endif
115#include <poll.h>
116#endif /* USE_POLL */
117#endif
118
119#include "un-namespace.h"
120
121/* Options.  Leave them on. */
122#ifndef	DEBUG
123#define	DEBUG
124#endif
125#include "res_debug.h"
126#include "res_private.h"
127
128#define EXT(res) ((res)->_u._ext)
129
130#if !defined(USE_POLL) && !defined(USE_KQUEUE)
131static const int highestFD = FD_SETSIZE - 1;
132#endif
133
134/* Forward. */
135
136static int		get_salen(const struct sockaddr *);
137static struct sockaddr * get_nsaddr(res_state, size_t);
138static int		send_vc(res_state, const u_char *, int,
139				u_char *, int, int *, int);
140static int		send_dg(res_state,
141#ifdef USE_KQUEUE
142				int kq,
143#endif
144				const u_char *, int,
145				u_char *, int, int *, int, int,
146				int *, int *);
147static void		Aerror(const res_state, FILE *, const char *, int,
148			       const struct sockaddr *, int);
149static void		Perror(const res_state, FILE *, const char *, int);
150static int		sock_eq(struct sockaddr *, struct sockaddr *);
151#if defined(NEED_PSELECT) && !defined(USE_POLL) && !defined(USE_KQUEUE)
152static int		pselect(int, void *, void *, void *,
153				struct timespec *,
154				const sigset_t *);
155#endif
156void res_pquery(const res_state, const u_char *, int, FILE *);
157
158static const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
159
160/* Public. */
161
162/*%
163 *	looks up "ina" in _res.ns_addr_list[]
164 *
165 * returns:
166 *\li	0  : not found
167 *\li	>0 : found
168 *
169 * author:
170 *\li	paul vixie, 29may94
171 */
172int
173res_ourserver_p(const res_state statp, const struct sockaddr *sa) {
174	const struct sockaddr_in *inp, *srv;
175	const struct sockaddr_in6 *in6p, *srv6;
176	int ns;
177
178	switch (sa->sa_family) {
179	case AF_INET:
180		inp = (const struct sockaddr_in *)sa;
181		for (ns = 0;  ns < statp->nscount;  ns++) {
182			srv = (struct sockaddr_in *)get_nsaddr(statp, ns);
183			if (srv->sin_family == inp->sin_family &&
184			    srv->sin_port == inp->sin_port &&
185			    (srv->sin_addr.s_addr == INADDR_ANY ||
186			     srv->sin_addr.s_addr == inp->sin_addr.s_addr))
187				return (1);
188		}
189		break;
190	case AF_INET6:
191		if (EXT(statp).ext == NULL)
192			break;
193		in6p = (const struct sockaddr_in6 *)sa;
194		for (ns = 0;  ns < statp->nscount;  ns++) {
195			srv6 = (struct sockaddr_in6 *)get_nsaddr(statp, ns);
196			if (srv6->sin6_family == in6p->sin6_family &&
197			    srv6->sin6_port == in6p->sin6_port &&
198#ifdef HAVE_SIN6_SCOPE_ID
199			    (srv6->sin6_scope_id == 0 ||
200			     srv6->sin6_scope_id == in6p->sin6_scope_id) &&
201#endif
202			    (IN6_IS_ADDR_UNSPECIFIED(&srv6->sin6_addr) ||
203			     IN6_ARE_ADDR_EQUAL(&srv6->sin6_addr, &in6p->sin6_addr)))
204				return (1);
205		}
206		break;
207	default:
208		break;
209	}
210	return (0);
211}
212
213/*%
214 *	look for (name,type,class) in the query section of packet (buf,eom)
215 *
216 * requires:
217 *\li	buf + HFIXEDSZ <= eom
218 *
219 * returns:
220 *\li	-1 : format error
221 *\li	0  : not found
222 *\li	>0 : found
223 *
224 * author:
225 *\li	paul vixie, 29may94
226 */
227int
228res_nameinquery(const char *name, int type, int class,
229		const u_char *buf, const u_char *eom)
230{
231	const u_char *cp = buf + HFIXEDSZ;
232	int qdcount = ntohs(((const HEADER*)buf)->qdcount);
233
234	while (qdcount-- > 0) {
235		char tname[MAXDNAME+1];
236		int n, ttype, tclass;
237
238		n = dn_expand(buf, eom, cp, tname, sizeof tname);
239		if (n < 0)
240			return (-1);
241		cp += n;
242		if (cp + 2 * INT16SZ > eom)
243			return (-1);
244		ttype = ns_get16(cp); cp += INT16SZ;
245		tclass = ns_get16(cp); cp += INT16SZ;
246		if (ttype == type && tclass == class &&
247		    ns_samename(tname, name) == 1)
248			return (1);
249	}
250	return (0);
251}
252
253/*%
254 *	is there a 1:1 mapping of (name,type,class)
255 *	in (buf1,eom1) and (buf2,eom2)?
256 *
257 * returns:
258 *\li	-1 : format error
259 *\li	0  : not a 1:1 mapping
260 *\li	>0 : is a 1:1 mapping
261 *
262 * author:
263 *\li	paul vixie, 29may94
264 */
265int
266res_queriesmatch(const u_char *buf1, const u_char *eom1,
267		 const u_char *buf2, const u_char *eom2)
268{
269	const u_char *cp = buf1 + HFIXEDSZ;
270	int qdcount = ntohs(((const HEADER*)buf1)->qdcount);
271
272	if (buf1 + HFIXEDSZ > eom1 || buf2 + HFIXEDSZ > eom2)
273		return (-1);
274
275	/*
276	 * Only header section present in replies to
277	 * dynamic update packets.
278	 */
279	if ((((const HEADER *)buf1)->opcode == ns_o_update) &&
280	    (((const HEADER *)buf2)->opcode == ns_o_update))
281		return (1);
282
283	if (qdcount != ntohs(((const HEADER*)buf2)->qdcount))
284		return (0);
285	while (qdcount-- > 0) {
286		char tname[MAXDNAME+1];
287		int n, ttype, tclass;
288
289		n = dn_expand(buf1, eom1, cp, tname, sizeof tname);
290		if (n < 0)
291			return (-1);
292		cp += n;
293		if (cp + 2 * INT16SZ > eom1)
294			return (-1);
295		ttype = ns_get16(cp);	cp += INT16SZ;
296		tclass = ns_get16(cp); cp += INT16SZ;
297		if (!res_nameinquery(tname, ttype, tclass, buf2, eom2))
298			return (0);
299	}
300	return (1);
301}
302
303int
304res_nsend(res_state statp,
305	  const u_char *buf, int buflen, u_char *ans, int anssiz)
306{
307	int gotsomewhere, terrno, tries, v_circuit, resplen, ns, n;
308#ifdef USE_KQUEUE
309	int kq;
310#endif
311	char abuf[NI_MAXHOST];
312
313	/* No name servers or res_init() failure */
314	if (statp->nscount == 0 || EXT(statp).ext == NULL) {
315		errno = ESRCH;
316		return (-1);
317	}
318	if (anssiz < HFIXEDSZ) {
319		errno = EINVAL;
320		return (-1);
321	}
322	DprintQ((statp->options & RES_DEBUG) || (statp->pfcode & RES_PRF_QUERY),
323		(stdout, ";; res_send()\n"), buf, buflen);
324	v_circuit = (statp->options & RES_USEVC) || buflen > PACKETSZ;
325	gotsomewhere = 0;
326	terrno = ETIMEDOUT;
327
328#ifdef USE_KQUEUE
329	if ((kq = kqueue()) < 0) {
330		Perror(statp, stderr, "kqueue", errno);
331		return (-1);
332	}
333#endif
334
335	/*
336	 * If the ns_addr_list in the resolver context has changed, then
337	 * invalidate our cached copy and the associated timing data.
338	 */
339	if (EXT(statp).nscount != 0) {
340		int needclose = 0;
341		struct sockaddr_storage peer;
342		ISC_SOCKLEN_T peerlen;
343
344		if (EXT(statp).nscount != statp->nscount)
345			needclose++;
346		else
347			for (ns = 0; ns < statp->nscount; ns++) {
348				if (statp->nsaddr_list[ns].sin_family &&
349				    !sock_eq((struct sockaddr *)&statp->nsaddr_list[ns],
350					     (struct sockaddr *)&EXT(statp).ext->nsaddrs[ns])) {
351					needclose++;
352					break;
353				}
354
355				if (EXT(statp).nssocks[ns] == -1)
356					continue;
357				peerlen = sizeof(peer);
358				if (_getpeername(EXT(statp).nssocks[ns],
359				    (struct sockaddr *)&peer, &peerlen) < 0) {
360					needclose++;
361					break;
362				}
363				if (!sock_eq((struct sockaddr *)&peer,
364				    get_nsaddr(statp, ns))) {
365					needclose++;
366					break;
367				}
368			}
369		if (needclose) {
370			res_nclose(statp);
371			EXT(statp).nscount = 0;
372		}
373	}
374
375	/*
376	 * Maybe initialize our private copy of the ns_addr_list.
377	 */
378	if (EXT(statp).nscount == 0) {
379		for (ns = 0; ns < statp->nscount; ns++) {
380			EXT(statp).nstimes[ns] = RES_MAXTIME;
381			EXT(statp).nssocks[ns] = -1;
382			if (!statp->nsaddr_list[ns].sin_family)
383				continue;
384			EXT(statp).ext->nsaddrs[ns].sin =
385				 statp->nsaddr_list[ns];
386		}
387		EXT(statp).nscount = statp->nscount;
388	}
389
390	/*
391	 * Some resolvers want to even out the load on their nameservers.
392	 * Note that RES_BLAST overrides RES_ROTATE.
393	 */
394	if ((statp->options & RES_ROTATE) != 0U &&
395	    (statp->options & RES_BLAST) == 0U) {
396		union res_sockaddr_union inu;
397		struct sockaddr_in ina;
398		int lastns = statp->nscount - 1;
399		int fd;
400		u_int16_t nstime;
401
402		if (EXT(statp).ext != NULL)
403			inu = EXT(statp).ext->nsaddrs[0];
404		ina = statp->nsaddr_list[0];
405		fd = EXT(statp).nssocks[0];
406		nstime = EXT(statp).nstimes[0];
407		for (ns = 0; ns < lastns; ns++) {
408			if (EXT(statp).ext != NULL)
409				EXT(statp).ext->nsaddrs[ns] =
410					EXT(statp).ext->nsaddrs[ns + 1];
411			statp->nsaddr_list[ns] = statp->nsaddr_list[ns + 1];
412			EXT(statp).nssocks[ns] = EXT(statp).nssocks[ns + 1];
413			EXT(statp).nstimes[ns] = EXT(statp).nstimes[ns + 1];
414		}
415		if (EXT(statp).ext != NULL)
416			EXT(statp).ext->nsaddrs[lastns] = inu;
417		statp->nsaddr_list[lastns] = ina;
418		EXT(statp).nssocks[lastns] = fd;
419		EXT(statp).nstimes[lastns] = nstime;
420	}
421
422	/*
423	 * Send request, RETRY times, or until successful.
424	 */
425	for (tries = 0; tries < statp->retry; tries++) {
426	    for (ns = 0; ns < statp->nscount; ns++) {
427		struct sockaddr *nsap;
428		int nsaplen;
429		nsap = get_nsaddr(statp, ns);
430		nsaplen = get_salen(nsap);
431		statp->_flags &= ~RES_F_LASTMASK;
432		statp->_flags |= (ns << RES_F_LASTSHIFT);
433 same_ns:
434		if (statp->qhook) {
435			int done = 0, loops = 0;
436
437			do {
438				res_sendhookact act;
439
440				act = (*statp->qhook)(&nsap, &buf, &buflen,
441						      ans, anssiz, &resplen);
442				switch (act) {
443				case res_goahead:
444					done = 1;
445					break;
446				case res_nextns:
447					res_nclose(statp);
448					goto next_ns;
449				case res_done:
450#ifdef USE_KQUEUE
451					_close(kq);
452#endif
453					return (resplen);
454				case res_modified:
455					/* give the hook another try */
456					if (++loops < 42) /*doug adams*/
457						break;
458					/*FALLTHROUGH*/
459				case res_error:
460					/*FALLTHROUGH*/
461				default:
462					goto fail;
463				}
464			} while (!done);
465		}
466
467		Dprint(((statp->options & RES_DEBUG) &&
468			getnameinfo(nsap, nsaplen, abuf, sizeof(abuf),
469				    NULL, 0, niflags) == 0),
470		       (stdout, ";; Querying server (# %d) address = %s\n",
471			ns + 1, abuf));
472
473
474		if (v_circuit) {
475			/* Use VC; at most one attempt per server. */
476			tries = statp->retry;
477			n = send_vc(statp, buf, buflen, ans, anssiz, &terrno,
478				    ns);
479			if (n < 0)
480				goto fail;
481			if (n == 0)
482				goto next_ns;
483			resplen = n;
484		} else {
485			/* Use datagrams. */
486			n = send_dg(statp,
487#ifdef USE_KQUEUE
488				    kq,
489#endif
490				    buf, buflen, ans, anssiz, &terrno,
491				    ns, tries, &v_circuit, &gotsomewhere);
492			if (n < 0)
493				goto fail;
494			if (n == 0)
495				goto next_ns;
496			if (v_circuit)
497				goto same_ns;
498			resplen = n;
499		}
500
501		Dprint((statp->options & RES_DEBUG) ||
502		       ((statp->pfcode & RES_PRF_REPLY) &&
503			(statp->pfcode & RES_PRF_HEAD1)),
504		       (stdout, ";; got answer:\n"));
505
506		DprintQ((statp->options & RES_DEBUG) ||
507			(statp->pfcode & RES_PRF_REPLY),
508			(stdout, "%s", ""),
509			ans, (resplen > anssiz) ? anssiz : resplen);
510
511		/*
512		 * If we have temporarily opened a virtual circuit,
513		 * or if we haven't been asked to keep a socket open,
514		 * close the socket.
515		 */
516		if ((v_circuit && (statp->options & RES_USEVC) == 0U) ||
517		    (statp->options & RES_STAYOPEN) == 0U) {
518			res_nclose(statp);
519		}
520		if (statp->rhook) {
521			int done = 0, loops = 0;
522
523			do {
524				res_sendhookact act;
525
526				act = (*statp->rhook)(nsap, buf, buflen,
527						      ans, anssiz, &resplen);
528				switch (act) {
529				case res_goahead:
530				case res_done:
531					done = 1;
532					break;
533				case res_nextns:
534					res_nclose(statp);
535					goto next_ns;
536				case res_modified:
537					/* give the hook another try */
538					if (++loops < 42) /*doug adams*/
539						break;
540					/*FALLTHROUGH*/
541				case res_error:
542					/*FALLTHROUGH*/
543				default:
544					goto fail;
545				}
546			} while (!done);
547
548		}
549#ifdef USE_KQUEUE
550		_close(kq);
551#endif
552		return (resplen);
553 next_ns: ;
554	   } /*foreach ns*/
555	} /*foreach retry*/
556	res_nclose(statp);
557#ifdef USE_KQUEUE
558	_close(kq);
559#endif
560	if (!v_circuit) {
561		if (!gotsomewhere)
562			errno = ECONNREFUSED;	/*%< no nameservers found */
563		else
564			errno = ETIMEDOUT;	/*%< no answer obtained */
565	} else
566		errno = terrno;
567	return (-1);
568 fail:
569	res_nclose(statp);
570#ifdef USE_KQUEUE
571	_close(kq);
572#endif
573	return (-1);
574}
575
576/* Private */
577
578static int
579get_salen(const struct sockaddr *sa)
580{
581
582#ifdef HAVE_SA_LEN
583	/* There are people do not set sa_len.  Be forgiving to them. */
584	if (sa->sa_len)
585		return (sa->sa_len);
586#endif
587
588	if (sa->sa_family == AF_INET)
589		return (sizeof(struct sockaddr_in));
590	else if (sa->sa_family == AF_INET6)
591		return (sizeof(struct sockaddr_in6));
592	else
593		return (0);	/*%< unknown, die on connect */
594}
595
596/*%
597 * pick appropriate nsaddr_list for use.  see res_init() for initialization.
598 */
599static struct sockaddr *
600get_nsaddr(res_state statp, size_t n)
601{
602
603	if (!statp->nsaddr_list[n].sin_family && EXT(statp).ext) {
604		/*
605		 * - EXT(statp).ext->nsaddrs[n] holds an address that is larger
606		 *   than struct sockaddr, and
607		 * - user code did not update statp->nsaddr_list[n].
608		 */
609		return (struct sockaddr *)(void *)&EXT(statp).ext->nsaddrs[n];
610	} else {
611		/*
612		 * - user code updated statp->nsaddr_list[n], or
613		 * - statp->nsaddr_list[n] has the same content as
614		 *   EXT(statp).ext->nsaddrs[n].
615		 */
616		return (struct sockaddr *)(void *)&statp->nsaddr_list[n];
617	}
618}
619
620static int
621send_vc(res_state statp,
622	const u_char *buf, int buflen, u_char *ans, int anssiz,
623	int *terrno, int ns)
624{
625	const HEADER *hp = (const HEADER *) buf;
626	HEADER *anhp = (HEADER *) ans;
627	struct sockaddr *nsap;
628	int nsaplen;
629	int truncating, connreset, resplen, n;
630	struct iovec iov[2];
631	u_short len;
632	u_char *cp;
633	void *tmp;
634#ifdef SO_NOSIGPIPE
635	int on = 1;
636#endif
637
638	nsap = get_nsaddr(statp, ns);
639	nsaplen = get_salen(nsap);
640
641	connreset = 0;
642 same_ns:
643	truncating = 0;
644
645	/* Are we still talking to whom we want to talk to? */
646	if (statp->_vcsock >= 0 && (statp->_flags & RES_F_VC) != 0) {
647		struct sockaddr_storage peer;
648		ISC_SOCKLEN_T size = sizeof peer;
649
650		if (_getpeername(statp->_vcsock,
651				(struct sockaddr *)&peer, &size) < 0 ||
652		    !sock_eq((struct sockaddr *)&peer, nsap)) {
653			res_nclose(statp);
654			statp->_flags &= ~RES_F_VC;
655		}
656	}
657
658	if (statp->_vcsock < 0 || (statp->_flags & RES_F_VC) == 0) {
659		if (statp->_vcsock >= 0)
660			res_nclose(statp);
661
662		statp->_vcsock = _socket(nsap->sa_family, SOCK_STREAM |
663		    SOCK_CLOEXEC, 0);
664#if !defined(USE_POLL) && !defined(USE_KQUEUE)
665		if (statp->_vcsock > highestFD) {
666			res_nclose(statp);
667			errno = ENOTSOCK;
668		}
669#endif
670		if (statp->_vcsock < 0) {
671			switch (errno) {
672			case EPROTONOSUPPORT:
673#ifdef EPFNOSUPPORT
674			case EPFNOSUPPORT:
675#endif
676			case EAFNOSUPPORT:
677				Perror(statp, stderr, "socket(vc)", errno);
678				return (0);
679			default:
680				*terrno = errno;
681				Perror(statp, stderr, "socket(vc)", errno);
682				return (-1);
683			}
684		}
685#ifdef SO_NOSIGPIPE
686		/*
687		 * Disable generation of SIGPIPE when writing to a closed
688		 * socket.  Write should return -1 and set errno to EPIPE
689		 * instead.
690		 *
691		 * Push on even if setsockopt(SO_NOSIGPIPE) fails.
692		 */
693		(void)_setsockopt(statp->_vcsock, SOL_SOCKET, SO_NOSIGPIPE, &on,
694				 sizeof(on));
695#endif
696		errno = 0;
697		if (_connect(statp->_vcsock, nsap, nsaplen) < 0) {
698			*terrno = errno;
699			Aerror(statp, stderr, "connect/vc", errno, nsap,
700			    nsaplen);
701			res_nclose(statp);
702			return (0);
703		}
704		statp->_flags |= RES_F_VC;
705	}
706
707	/*
708	 * Send length & message
709	 */
710	ns_put16((u_short)buflen, (u_char*)&len);
711	iov[0] = evConsIovec(&len, INT16SZ);
712	DE_CONST(buf, tmp);
713	iov[1] = evConsIovec(tmp, buflen);
714	if (_writev(statp->_vcsock, iov, 2) != (INT16SZ + buflen)) {
715		*terrno = errno;
716		Perror(statp, stderr, "write failed", errno);
717		res_nclose(statp);
718		return (0);
719	}
720	/*
721	 * Receive length & response
722	 */
723 read_len:
724	cp = ans;
725	len = INT16SZ;
726	while ((n = _read(statp->_vcsock, (char *)cp, (int)len)) > 0) {
727		cp += n;
728		if ((len -= n) == 0)
729			break;
730	}
731	if (n <= 0) {
732		*terrno = errno;
733		Perror(statp, stderr, "read failed", errno);
734		res_nclose(statp);
735		/*
736		 * A long running process might get its TCP
737		 * connection reset if the remote server was
738		 * restarted.  Requery the server instead of
739		 * trying a new one.  When there is only one
740		 * server, this means that a query might work
741		 * instead of failing.  We only allow one reset
742		 * per query to prevent looping.
743		 */
744		if (*terrno == ECONNRESET && !connreset) {
745			connreset = 1;
746			res_nclose(statp);
747			goto same_ns;
748		}
749		res_nclose(statp);
750		return (0);
751	}
752	resplen = ns_get16(ans);
753	if (resplen > anssiz) {
754		Dprint(statp->options & RES_DEBUG,
755		       (stdout, ";; response truncated\n")
756		       );
757		truncating = 1;
758		len = anssiz;
759	} else
760		len = resplen;
761	if (len < HFIXEDSZ) {
762		/*
763		 * Undersized message.
764		 */
765		Dprint(statp->options & RES_DEBUG,
766		       (stdout, ";; undersized: %d\n", len));
767		*terrno = EMSGSIZE;
768		res_nclose(statp);
769		return (0);
770	}
771	cp = ans;
772	while (len != 0 &&
773	    (n = _read(statp->_vcsock, (char *)cp, (int)len)) > 0) {
774		cp += n;
775		len -= n;
776	}
777	if (n <= 0) {
778		*terrno = errno;
779		Perror(statp, stderr, "read(vc)", errno);
780		res_nclose(statp);
781		return (0);
782	}
783	if (truncating) {
784		/*
785		 * Flush rest of answer so connection stays in synch.
786		 */
787		anhp->tc = 1;
788		len = resplen - anssiz;
789		while (len != 0) {
790			char junk[PACKETSZ];
791
792			n = _read(statp->_vcsock, junk,
793			    (len > sizeof junk) ? sizeof junk : len);
794			if (n > 0)
795				len -= n;
796			else
797				break;
798		}
799	}
800	/*
801	 * If the calling applicating has bailed out of
802	 * a previous call and failed to arrange to have
803	 * the circuit closed or the server has got
804	 * itself confused, then drop the packet and
805	 * wait for the correct one.
806	 */
807	if (hp->id != anhp->id) {
808		DprintQ((statp->options & RES_DEBUG) ||
809			(statp->pfcode & RES_PRF_REPLY),
810			(stdout, ";; old answer (unexpected):\n"),
811			ans, (resplen > anssiz) ? anssiz: resplen);
812		goto read_len;
813	}
814
815	/*
816	 * All is well, or the error is fatal.  Signal that the
817	 * next nameserver ought not be tried.
818	 */
819	return (resplen);
820}
821
822static int
823send_dg(res_state statp,
824#ifdef USE_KQUEUE
825	int kq,
826#endif
827	const u_char *buf, int buflen, u_char *ans,
828	int anssiz, int *terrno, int ns, int tries, int *v_circuit,
829	int *gotsomewhere)
830{
831	const HEADER *hp = (const HEADER *) buf;
832	HEADER *anhp = (HEADER *) ans;
833	const struct sockaddr *nsap;
834	int nsaplen;
835	struct timespec now, timeout, finish;
836	struct sockaddr_storage from;
837	ISC_SOCKLEN_T fromlen;
838	int resplen, seconds, n, s;
839#ifdef USE_KQUEUE
840	struct kevent kv;
841#else
842#ifdef USE_POLL
843	int     polltimeout;
844	struct pollfd   pollfd;
845#else
846	fd_set dsmask;
847#endif
848#endif
849
850	nsap = get_nsaddr(statp, ns);
851	nsaplen = get_salen(nsap);
852	if (EXT(statp).nssocks[ns] == -1) {
853		EXT(statp).nssocks[ns] = _socket(nsap->sa_family,
854		    SOCK_DGRAM | SOCK_CLOEXEC, 0);
855#if !defined(USE_POLL) && !defined(USE_KQUEUE)
856		if (EXT(statp).nssocks[ns] > highestFD) {
857			res_nclose(statp);
858			errno = ENOTSOCK;
859		}
860#endif
861		if (EXT(statp).nssocks[ns] < 0) {
862			switch (errno) {
863			case EPROTONOSUPPORT:
864#ifdef EPFNOSUPPORT
865			case EPFNOSUPPORT:
866#endif
867			case EAFNOSUPPORT:
868				Perror(statp, stderr, "socket(dg)", errno);
869				return (0);
870			default:
871				*terrno = errno;
872				Perror(statp, stderr, "socket(dg)", errno);
873				return (-1);
874			}
875		}
876#ifndef CANNOT_CONNECT_DGRAM
877		/*
878		 * On a 4.3BSD+ machine (client and server,
879		 * actually), sending to a nameserver datagram
880		 * port with no nameserver will cause an
881		 * ICMP port unreachable message to be returned.
882		 * If our datagram socket is "connected" to the
883		 * server, we get an ECONNREFUSED error on the next
884		 * socket operation, and select returns if the
885		 * error message is received.  We can thus detect
886		 * the absence of a nameserver without timing out.
887		 *
888		 * When the option "insecure1" is specified, we'd
889		 * rather expect to see responses from an "unknown"
890		 * address.  In order to let the kernel accept such
891		 * responses, do not connect the socket here.
892		 * XXX: or do we need an explicit option to disable
893		 * connecting?
894		 */
895		if (!(statp->options & RES_INSECURE1) &&
896		    _connect(EXT(statp).nssocks[ns], nsap, nsaplen) < 0) {
897			Aerror(statp, stderr, "connect(dg)", errno, nsap,
898			    nsaplen);
899			res_nclose(statp);
900			return (0);
901		}
902#endif /* !CANNOT_CONNECT_DGRAM */
903		Dprint(statp->options & RES_DEBUG,
904		       (stdout, ";; new DG socket\n"))
905	}
906	s = EXT(statp).nssocks[ns];
907#ifndef CANNOT_CONNECT_DGRAM
908	if (statp->options & RES_INSECURE1) {
909		if (_sendto(s,
910		    (const char*)buf, buflen, 0, nsap, nsaplen) != buflen) {
911			Aerror(statp, stderr, "sendto", errno, nsap, nsaplen);
912			res_nclose(statp);
913			return (0);
914		}
915	} else if (send(s, (const char*)buf, buflen, 0) != buflen) {
916		Perror(statp, stderr, "send", errno);
917		res_nclose(statp);
918		return (0);
919	}
920#else /* !CANNOT_CONNECT_DGRAM */
921	if (_sendto(s, (const char*)buf, buflen, 0, nsap, nsaplen) != buflen)
922	{
923		Aerror(statp, stderr, "sendto", errno, nsap, nsaplen);
924		res_nclose(statp);
925		return (0);
926	}
927#endif /* !CANNOT_CONNECT_DGRAM */
928
929	/*
930	 * Wait for reply.
931	 */
932	seconds = (statp->retrans << tries);
933	if (ns > 0)
934		seconds /= statp->nscount;
935	if (seconds <= 0)
936		seconds = 1;
937	now = evNowTime();
938	timeout = evConsTime(seconds, 0);
939	finish = evAddTime(now, timeout);
940	goto nonow;
941 wait:
942	now = evNowTime();
943 nonow:
944#ifndef USE_POLL
945	if (evCmpTime(finish, now) > 0)
946		timeout = evSubTime(finish, now);
947	else
948		timeout = evConsTime(0, 0);
949#ifdef USE_KQUEUE
950	EV_SET(&kv, s, EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, 0);
951	n = _kevent(kq, &kv, 1, &kv, 1, &timeout);
952#else
953	FD_ZERO(&dsmask);
954	FD_SET(s, &dsmask);
955	n = pselect(s + 1, &dsmask, NULL, NULL, &timeout, NULL);
956#endif
957#else
958	timeout = evSubTime(finish, now);
959	if (timeout.tv_sec < 0)
960		timeout = evConsTime(0, 0);
961	polltimeout = 1000*timeout.tv_sec +
962		timeout.tv_nsec/1000000;
963	pollfd.fd = s;
964	pollfd.events = POLLRDNORM;
965	n = _poll(&pollfd, 1, polltimeout);
966#endif /* USE_POLL */
967
968	if (n == 0) {
969		Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
970		*gotsomewhere = 1;
971		return (0);
972	}
973	if (n < 0) {
974		if (errno == EINTR)
975			goto wait;
976#ifdef USE_KQUEUE
977		Perror(statp, stderr, "kevent", errno);
978#else
979#ifndef USE_POLL
980		Perror(statp, stderr, "select", errno);
981#else
982		Perror(statp, stderr, "poll", errno);
983#endif /* USE_POLL */
984#endif
985		res_nclose(statp);
986		return (0);
987	}
988#ifdef USE_KQUEUE
989	if (kv.ident != s)
990		goto wait;
991#endif
992	errno = 0;
993	fromlen = sizeof(from);
994	resplen = _recvfrom(s, (char*)ans, anssiz,0,
995			   (struct sockaddr *)&from, &fromlen);
996	if (resplen <= 0) {
997		Perror(statp, stderr, "recvfrom", errno);
998		res_nclose(statp);
999		return (0);
1000	}
1001	*gotsomewhere = 1;
1002	if (resplen < HFIXEDSZ) {
1003		/*
1004		 * Undersized message.
1005		 */
1006		Dprint(statp->options & RES_DEBUG,
1007		       (stdout, ";; undersized: %d\n",
1008			resplen));
1009		*terrno = EMSGSIZE;
1010		res_nclose(statp);
1011		return (0);
1012	}
1013	if (hp->id != anhp->id) {
1014		/*
1015		 * response from old query, ignore it.
1016		 * XXX - potential security hazard could
1017		 *	 be detected here.
1018		 */
1019		DprintQ((statp->options & RES_DEBUG) ||
1020			(statp->pfcode & RES_PRF_REPLY),
1021			(stdout, ";; old answer:\n"),
1022			ans, (resplen > anssiz) ? anssiz : resplen);
1023		goto wait;
1024	}
1025	if (!(statp->options & RES_INSECURE1) &&
1026	    !res_ourserver_p(statp, (struct sockaddr *)&from)) {
1027		/*
1028		 * response from wrong server? ignore it.
1029		 * XXX - potential security hazard could
1030		 *	 be detected here.
1031		 */
1032		DprintQ((statp->options & RES_DEBUG) ||
1033			(statp->pfcode & RES_PRF_REPLY),
1034			(stdout, ";; not our server:\n"),
1035			ans, (resplen > anssiz) ? anssiz : resplen);
1036		goto wait;
1037	}
1038#ifdef RES_USE_EDNS0
1039	if (anhp->rcode == FORMERR && (statp->options & RES_USE_EDNS0) != 0U) {
1040		/*
1041		 * Do not retry if the server do not understand EDNS0.
1042		 * The case has to be captured here, as FORMERR packet do not
1043		 * carry query section, hence res_queriesmatch() returns 0.
1044		 */
1045		DprintQ(statp->options & RES_DEBUG,
1046			(stdout, "server rejected query with EDNS0:\n"),
1047			ans, (resplen > anssiz) ? anssiz : resplen);
1048		/* record the error */
1049		statp->_flags |= RES_F_EDNS0ERR;
1050		res_nclose(statp);
1051		return (0);
1052	}
1053#endif
1054	if (!(statp->options & RES_INSECURE2) &&
1055	    !res_queriesmatch(buf, buf + buflen,
1056			      ans, ans + anssiz)) {
1057		/*
1058		 * response contains wrong query? ignore it.
1059		 * XXX - potential security hazard could
1060		 *	 be detected here.
1061		 */
1062		DprintQ((statp->options & RES_DEBUG) ||
1063			(statp->pfcode & RES_PRF_REPLY),
1064			(stdout, ";; wrong query name:\n"),
1065			ans, (resplen > anssiz) ? anssiz : resplen);
1066		goto wait;
1067	}
1068	if (anhp->rcode == SERVFAIL ||
1069	    anhp->rcode == NOTIMP ||
1070	    anhp->rcode == REFUSED) {
1071		DprintQ(statp->options & RES_DEBUG,
1072			(stdout, "server rejected query:\n"),
1073			ans, (resplen > anssiz) ? anssiz : resplen);
1074		res_nclose(statp);
1075		/* don't retry if called from dig */
1076		if (!statp->pfcode)
1077			return (0);
1078	}
1079	if (!(statp->options & RES_IGNTC) && anhp->tc) {
1080		/*
1081		 * To get the rest of answer,
1082		 * use TCP with same server.
1083		 */
1084		Dprint(statp->options & RES_DEBUG,
1085		       (stdout, ";; truncated answer\n"));
1086		*v_circuit = 1;
1087		res_nclose(statp);
1088		return (1);
1089	}
1090	/*
1091	 * All is well, or the error is fatal.  Signal that the
1092	 * next nameserver ought not be tried.
1093	 */
1094	return (resplen);
1095}
1096
1097static void
1098Aerror(const res_state statp, FILE *file, const char *string, int error,
1099       const struct sockaddr *address, int alen)
1100{
1101	int save = errno;
1102	char hbuf[NI_MAXHOST];
1103	char sbuf[NI_MAXSERV];
1104
1105	if ((statp->options & RES_DEBUG) != 0U) {
1106		if (getnameinfo(address, alen, hbuf, sizeof(hbuf),
1107		    sbuf, sizeof(sbuf), niflags)) {
1108			strncpy(hbuf, "?", sizeof(hbuf) - 1);
1109			hbuf[sizeof(hbuf) - 1] = '\0';
1110			strncpy(sbuf, "?", sizeof(sbuf) - 1);
1111			sbuf[sizeof(sbuf) - 1] = '\0';
1112		}
1113		fprintf(file, "res_send: %s ([%s].%s): %s\n",
1114			string, hbuf, sbuf, strerror(error));
1115	}
1116	errno = save;
1117}
1118
1119static void
1120Perror(const res_state statp, FILE *file, const char *string, int error) {
1121	int save = errno;
1122
1123	if ((statp->options & RES_DEBUG) != 0U)
1124		fprintf(file, "res_send: %s: %s\n",
1125			string, strerror(error));
1126	errno = save;
1127}
1128
1129static int
1130sock_eq(struct sockaddr *a, struct sockaddr *b) {
1131	struct sockaddr_in *a4, *b4;
1132	struct sockaddr_in6 *a6, *b6;
1133
1134	if (a->sa_family != b->sa_family)
1135		return 0;
1136	switch (a->sa_family) {
1137	case AF_INET:
1138		a4 = (struct sockaddr_in *)a;
1139		b4 = (struct sockaddr_in *)b;
1140		return a4->sin_port == b4->sin_port &&
1141		    a4->sin_addr.s_addr == b4->sin_addr.s_addr;
1142	case AF_INET6:
1143		a6 = (struct sockaddr_in6 *)a;
1144		b6 = (struct sockaddr_in6 *)b;
1145		return a6->sin6_port == b6->sin6_port &&
1146#ifdef HAVE_SIN6_SCOPE_ID
1147		    a6->sin6_scope_id == b6->sin6_scope_id &&
1148#endif
1149		    IN6_ARE_ADDR_EQUAL(&a6->sin6_addr, &b6->sin6_addr);
1150	default:
1151		return 0;
1152	}
1153}
1154
1155#if defined(NEED_PSELECT) && !defined(USE_POLL) && !defined(USE_KQUEUE)
1156/* XXX needs to move to the porting library. */
1157static int
1158pselect(int nfds, void *rfds, void *wfds, void *efds,
1159	struct timespec *tsp, const sigset_t *sigmask)
1160{
1161	struct timeval tv, *tvp;
1162	sigset_t sigs;
1163	int n;
1164
1165	if (tsp) {
1166		tvp = &tv;
1167		tv = evTimeVal(*tsp);
1168	} else
1169		tvp = NULL;
1170	if (sigmask)
1171		sigprocmask(SIG_SETMASK, sigmask, &sigs);
1172	n = select(nfds, rfds, wfds, efds, tvp);
1173	if (sigmask)
1174		sigprocmask(SIG_SETMASK, &sigs, NULL);
1175	if (tsp)
1176		*tsp = evTimeSpec(tv);
1177	return (n);
1178}
1179#endif
1180