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) 68 static const char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; 69 static 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$"); 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) 131 static const int highestFD = FD_SETSIZE - 1; 132 #endif 133 134 /* Forward. */ 135 136 static int get_salen(const struct sockaddr *); 137 static struct sockaddr * get_nsaddr(res_state, size_t); 138 static int send_vc(res_state, const u_char *, int, 139 u_char *, int, int *, int); 140 static 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 *); 147 static void Aerror(const res_state, FILE *, const char *, int, 148 const struct sockaddr *, int); 149 static void Perror(const res_state, FILE *, const char *, int); 150 static int sock_eq(struct sockaddr *, struct sockaddr *); 151 #if defined(NEED_PSELECT) && !defined(USE_POLL) && !defined(USE_KQUEUE) 152 static int pselect(int, void *, void *, void *, 153 struct timespec *, 154 const sigset_t *); 155 #endif 156 void res_pquery(const res_state, const u_char *, int, FILE *); 157 158 static 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 */ 172 int 173 res_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 */ 227 int 228 res_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 */ 265 int 266 res_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 303 int 304 res_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 578 static int 579 get_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 */ 599 static struct sockaddr * 600 get_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 620 static int 621 send_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 822 static int 823 send_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 1097 static void 1098 Aerror(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 1119 static void 1120 Perror(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 1129 static int 1130 sock_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. */ 1157 static int 1158 pselect(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