From 9498fd15c70c2daf386dda13c43d7a2d984f0892 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 14 May 2013 01:54:58 +0200 Subject: [PATCH] deps: upgrade c-ares to 1.10.0 --- deps/cares/.gitignore | 5 +- deps/cares/Makefile | 53 +++++ deps/cares/build.mk | 143 ++++++++++++ deps/cares/cares.gyp | 1 + deps/cares/include/ares.h | 40 ++-- deps/cares/include/ares_version.h | 6 +- deps/cares/include/nameser.h | 8 + deps/cares/src/AUTHORS | 21 ++ deps/cares/src/CHANGES | 7 - deps/cares/src/README | 2 - deps/cares/src/RELEASE-NOTES | 33 ++- deps/cares/src/ares__close_sockets.c | 5 - deps/cares/src/ares__get_hostent.c | 5 +- deps/cares/src/ares__read_line.c | 4 +- deps/cares/src/ares_cancel.c | 42 ++-- deps/cares/src/ares_create_query.c | 208 ++++++++++++++++++ deps/cares/src/ares_data.c | 32 +-- deps/cares/src/ares_data.h | 3 +- deps/cares/src/ares_destroy.c | 3 +- deps/cares/src/ares_dns.h | 8 +- deps/cares/src/ares_expand_name.c | 6 +- deps/cares/src/ares_expand_string.c | 5 - deps/cares/src/ares_fds.c | 4 - deps/cares/src/ares_free_hostent.c | 1 - deps/cares/src/ares_free_string.c | 2 +- deps/cares/src/ares_gethostbyaddr.c | 9 +- deps/cares/src/ares_gethostbyname.c | 21 +- deps/cares/src/ares_getnameinfo.c | 12 - deps/cares/src/ares_getsock.c | 4 - .../src/{inet_net_pton.h => ares_inet_net_pton.h} | 8 +- deps/cares/src/ares_init.c | 44 +--- deps/cares/src/ares_library_init.c | 7 +- deps/cares/src/ares_llist.c | 23 -- deps/cares/src/ares_llist.h | 3 - deps/cares/src/ares_mkquery.c | 173 +-------------- deps/cares/src/ares_nowarn.c | 3 - deps/cares/src/ares_options.c | 64 ++++-- deps/cares/src/ares_parse_a_reply.c | 11 +- deps/cares/src/ares_parse_aaaa_reply.c | 15 +- deps/cares/src/ares_parse_mx_reply.c | 10 +- deps/cares/src/ares_parse_naptr_reply.c | 10 +- deps/cares/src/ares_parse_ns_reply.c | 11 +- deps/cares/src/ares_parse_ptr_reply.c | 13 +- deps/cares/src/ares_parse_soa_reply.c | 5 - deps/cares/src/ares_parse_srv_reply.c | 10 +- deps/cares/src/ares_parse_txt_reply.c | 89 ++++---- deps/cares/src/ares_private.h | 17 +- deps/cares/src/ares_process.c | 242 ++++++++++++--------- deps/cares/src/ares_query.c | 17 +- deps/cares/src/ares_search.c | 5 - deps/cares/src/ares_send.c | 13 +- deps/cares/src/ares_timeout.c | 12 +- deps/cares/src/bitncmp.c | 40 ++-- deps/cares/src/bitncmp.h | 6 +- deps/cares/src/get_ver.awk | 35 --- deps/cares/src/inet_net_pton.c | 17 +- deps/cares/src/inet_ntop.c | 28 +-- deps/cares/src/inet_ntop.h | 26 --- deps/cares/src/setup_once.h | 44 +++- 59 files changed, 940 insertions(+), 754 deletions(-) create mode 100644 deps/cares/Makefile create mode 100644 deps/cares/build.mk delete mode 100644 deps/cares/src/CHANGES create mode 100644 deps/cares/src/ares_create_query.c rename deps/cares/src/{inet_net_pton.h => ares_inet_net_pton.h} (82%) delete mode 100644 deps/cares/src/get_ver.awk delete mode 100644 deps/cares/src/inet_ntop.h diff --git a/deps/cares/.gitignore b/deps/cares/.gitignore index 79b4d2a..734ef94 100644 --- a/deps/cares/.gitignore +++ b/deps/cares/.gitignore @@ -4,7 +4,6 @@ /cares.Makefile /cares.target.mk -/Makefile /*.opensdf /*.sdf @@ -13,3 +12,7 @@ /*.vcxproj /*.vcxproj.filters /*.vcxproj.user + +*.so +*.[oa] +.buildstamp diff --git a/deps/cares/Makefile b/deps/cares/Makefile new file mode 100644 index 0000000..069c67e --- /dev/null +++ b/deps/cares/Makefile @@ -0,0 +1,53 @@ +# Copyright Joyent, Inc. and other Node contributors. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +SRCDIR ?= $(CURDIR) + +ifeq (,$(builddir_name)) + +VPATH := $(SRCDIR) +include $(SRCDIR)/build.mk + +else # Out of tree build. + +# Drop all built-in rules. +.SUFFIXES: + +.PHONY: $(builddir_name) +$(builddir_name): $(builddir_name)/.buildstamp + $(MAKE) -C $@ -f $(CURDIR)/Makefile $(MAKECMDGOALS) \ + SRCDIR=$(CURDIR) builddir_name= + +$(builddir_name)/.buildstamp: + mkdir -p $(dir $@) + touch $@ + +# Add no-op rules for Makefiles to stop make from trying to rebuild them. +Makefile:: ; +%.mk:: ; + +# Turn everything else into a no-op rule that depends on the build directory. +%:: $(builddir_name) ; + +.PHONY: clean +clean: + $(RM) -fr $(builddir_name) + +endif diff --git a/deps/cares/build.mk b/deps/cares/build.mk new file mode 100644 index 0000000..ea239eb --- /dev/null +++ b/deps/cares/build.mk @@ -0,0 +1,143 @@ +# Copyright Joyent, Inc. and other Node contributors. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +OS ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"') + +OBJS= \ + src/ares_cancel.o \ + src/ares__close_sockets.o \ + src/ares_create_query.o \ + src/ares_data.o \ + src/ares_destroy.o \ + src/ares_expand_name.o \ + src/ares_expand_string.o \ + src/ares_fds.o \ + src/ares_free_hostent.o \ + src/ares_free_string.o \ + src/ares_gethostbyaddr.o \ + src/ares_gethostbyname.o \ + src/ares__get_hostent.o \ + src/ares_getnameinfo.o \ + src/ares_getopt.o \ + src/ares_getsock.o \ + src/ares_init.o \ + src/ares_library_init.o \ + src/ares_llist.o \ + src/ares_mkquery.o \ + src/ares_nowarn.o \ + src/ares_options.o \ + src/ares_parse_aaaa_reply.o \ + src/ares_parse_a_reply.o \ + src/ares_parse_mx_reply.o \ + src/ares_parse_naptr_reply.o \ + src/ares_parse_ns_reply.o \ + src/ares_parse_ptr_reply.o \ + src/ares_parse_soa_reply.o \ + src/ares_parse_srv_reply.o \ + src/ares_parse_txt_reply.o \ + src/ares_process.o \ + src/ares_query.o \ + src/ares__read_line.o \ + src/ares_search.o \ + src/ares_send.o \ + src/ares_strcasecmp.o \ + src/ares_strdup.o \ + src/ares_strerror.o \ + src/ares_timeout.o \ + src/ares__timeval.o \ + src/ares_version.o \ + src/ares_writev.o \ + src/bitncmp.o \ + src/inet_net_pton.o \ + src/inet_ntop.o \ + +CFLAGS += -I. -I$(SRCDIR)/include -DHAVE_CONFIG_H + +ARES_CONFIG_OS = $(OS) +SOEXT = so + +# if on windows +ifneq (,$(findstring mingw,$(OS))) +ARES_CONFIG_OS = win32 +OBJS += src/windows_port.o +OBJS += src/ares_getenv.o +OBJS += src/ares_platform.o + +LDFLAGS += -lws2_32.lib -liphlpapi.lib +else # else a posix system +CFLAGS += -g --std=gnu89 -pedantic +CFLAGS += -Wall -Wextra -Wno-unused-parameter +CFLAGS += -D_LARGEFILE_SOURCE +CFLAGS += -D_FILE_OFFSET_BITS=64 +endif + +ifneq (,$(findstring cygwin,$(OS))) +ARES_CONFIG_OS = cygwin +CFLAGS += -D_GNU_SOURCE +endif + +ifeq (dragonflybsd,$(OS)) +ARES_CONFIG_OS = freebsd +endif + +ifeq (darwin,$(OS)) +CFLAGS += -D_DARWIN_USE_64_BIT_INODE=1 +LDFLAGS += -dynamiclib -install_name "@rpath/libcares.dylib" +SOEXT = dylib +endif + +ifeq (linux,$(OS)) +CFLAGS += -D_GNU_SOURCE +endif + +ifeq (sunos,$(OS)) +LDFLAGS += -lsocket -lnsl +CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=500 +endif + +CFLAGS += -I$(SRCDIR)/config/$(ARES_CONFIG_OS) + +ifneq (,$(findstring libcares.$(SOEXT),$(MAKECMDGOALS))) +CFLAGS += -DCARES_BUILDING_LIBRARY +else +CFLAGS += -DCARES_STATICLIB +endif + +all: libcares.a + +src/.buildstamp: + mkdir -p $(dir $@) + touch $@ + +libcares.a: $(OBJS) + $(AR) rcs $@ $^ + +libcares.$(SOEXT): override CFLAGS += -fPIC +libcares.$(SOEXT): $(OBJS:%.o=%.pic.o) + $(CC) -shared -o $@ $^ $(LDFLAGS) + +src/%.o src/%.pic.o: src/%.c include/ares.h include/ares_version.h \ + include/nameser.h src/.buildstamp \ + $(SRCDIR)/config/$(ARES_CONFIG_OS)/ares_config.h + $(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + $(RM) -f libcares.a libcares.$(SOEXT) src/*.o src/.buildstamp diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp index 7576712..1a6b735 100644 --- a/deps/cares/cares.gyp +++ b/deps/cares/cares.gyp @@ -34,6 +34,7 @@ 'include/nameser.h', 'src/ares_cancel.c', 'src/ares__close_sockets.c', + 'src/ares_create_query.c', 'src/ares_data.c', 'src/ares_data.h', 'src/ares_destroy.c', diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index 96eccab..3d0f9cf 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -1,6 +1,6 @@ -/* Copyright 1998, 2009 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2011 by Daniel Stenberg +/* Copyright 1998 by the Massachusetts Institute of Technology. + * Copyright (C) 2007-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -123,22 +123,18 @@ extern "C" { ** c-ares external API function linkage decorations. */ -#if !defined(CARES_STATICLIB) && \ - (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) - /* __declspec function decoration for Win32 and Symbian DLL's */ +#ifdef CARES_STATICLIB +# define CARES_EXTERN +#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) # if defined(CARES_BUILDING_LIBRARY) # define CARES_EXTERN __declspec(dllexport) # else # define CARES_EXTERN __declspec(dllimport) # endif +#elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) +# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN #else - /* visibility function decoration for other cases */ -# if !defined(CARES_SYMBOL_HIDING) || \ - defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) -# define CARES_EXTERN -# else -# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN -# endif +# define CARES_EXTERN #endif @@ -191,6 +187,7 @@ extern "C" { #define ARES_FLAG_NOSEARCH (1 << 5) #define ARES_FLAG_NOALIASES (1 << 6) #define ARES_FLAG_NOCHECKRESP (1 << 7) +#define ARES_FLAG_EDNS (1 << 8) /* Option mask values */ #define ARES_OPT_FLAGS (1 << 0) @@ -208,6 +205,7 @@ extern "C" { #define ARES_OPT_SOCK_RCVBUF (1 << 12) #define ARES_OPT_TIMEOUTMS (1 << 13) #define ARES_OPT_ROTATE (1 << 14) +#define ARES_OPT_EDNSPSZ (1 << 15) /* Nameinfo flag values */ #define ARES_NI_NOFQDN (1 << 0) @@ -313,6 +311,7 @@ struct ares_options { void *sock_state_cb_data; struct apattern *sortlist; int nsort; + int ednspsz; }; struct hostent; @@ -451,6 +450,15 @@ CARES_EXTERN void ares_process_fd(ares_channel channel, ares_socket_t read_fd, ares_socket_t write_fd); +CARES_EXTERN int ares_create_query(const char *name, + int dnsclass, + int type, + unsigned short id, + int rd, + unsigned char **buf, + int *buflen, + int max_udp_size); + CARES_EXTERN int ares_mkquery(const char *name, int dnsclass, int type, @@ -589,8 +597,6 @@ CARES_EXTERN void ares_free_string(void *str); CARES_EXTERN void ares_free_hostent(struct hostent *host); -CARES_EXTERN void ares_free_soa(struct ares_soa_reply *soa); - CARES_EXTERN void ares_free_data(void *dataptr); CARES_EXTERN const char *ares_strerror(int code); @@ -615,6 +621,12 @@ CARES_EXTERN int ares_set_servers_csv(ares_channel channel, CARES_EXTERN int ares_get_servers(ares_channel channel, struct ares_addr_node **servers); +CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, + ares_socklen_t size); + +CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); + + #ifdef __cplusplus } #endif diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 84b97cd..cdd4992 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -3,15 +3,15 @@ #define ARES__VERSION_H /* This is the global package copyright */ -#define ARES_COPYRIGHT "2004 - 2012 Daniel Stenberg, ." +#define ARES_COPYRIGHT "2004 - 2013 Daniel Stenberg, ." #define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 9 +#define ARES_VERSION_MINOR 10 #define ARES_VERSION_PATCH 0 #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ (ARES_VERSION_MINOR<<8)|\ (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.9.0-DEV" +#define ARES_VERSION_STR "1.10.0-DEV" #if (ARES_VERSION >= 0x010700) # define CARES_HAVE_ARES_LIBRARY_INIT 1 diff --git a/deps/cares/include/nameser.h b/deps/cares/include/nameser.h index 45f1e3e..a0302fd 100644 --- a/deps/cares/include/nameser.h +++ b/deps/cares/include/nameser.h @@ -186,11 +186,19 @@ typedef enum __ns_rcode { #define T_SRV ns_t_srv #define T_ATMA ns_t_atma #define T_NAPTR ns_t_naptr +#define T_KX ns_t_kx +#define T_CERT ns_t_cert +#define T_A6 ns_t_a6 +#define T_DNAME ns_t_dname +#define T_SINK ns_t_sink +#define T_OPT ns_t_opt +#define T_APL ns_t_apl #define T_DS ns_t_ds #define T_SSHFP ns_t_sshfp #define T_RRSIG ns_t_rrsig #define T_NSEC ns_t_nsec #define T_DNSKEY ns_t_dnskey +#define T_TKEY ns_t_tkey #define T_TSIG ns_t_tsig #define T_IXFR ns_t_ixfr #define T_AXFR ns_t_axfr diff --git a/deps/cares/src/AUTHORS b/deps/cares/src/AUTHORS index e197a74..905c1bb 100644 --- a/deps/cares/src/AUTHORS +++ b/deps/cares/src/AUTHORS @@ -1,15 +1,24 @@ c-ares is based on ares, and these are the people that have worked on it since the fork was made: +Albert Chin Alexander Lazic Alexey Simak Andreas Rieke +Andrew C. Morrow Ashish Sharma +Ben Greear +Ben Noordhuis +BogDan Vatra Brad House Brad Spencer Bram Matthys Dan Fandrich +Daniel Johnson Daniel Stenberg +David Stuart +Denis Bilenko +Dima Tisnek Dirk Manske Dominick Meglio Doug Goldstein @@ -18,19 +27,31 @@ Eino Tuominen Erik Kline George Neill Gisle Vanem +Guenter Knauf Guilherme Balena Versiani Gunter Knauf Henrik Stoerner +Jakub Hrozek James Bursa +Jérémy Lal +Marko Kreen Michael Wallner +Mike Crowe +Nick Alcock Nick Mathewson +Patrik Thunstrom +Peter Pentchev Phil Blundell +Poul Thomas Lomholt Ravi Pratap Robin Cornelius Sebastian at basti79.de Shmulik Regev +Stefan Bühler Steinar H. Gunderson Tofu Linden +Tom Hughes +Tor Arntsen Vlad Dinulescu William Ahern Yang Tse diff --git a/deps/cares/src/CHANGES b/deps/cares/src/CHANGES deleted file mode 100644 index f1426fd..0000000 --- a/deps/cares/src/CHANGES +++ /dev/null @@ -1,7 +0,0 @@ -This file no longer holds the changelog. Now you can generate it yourself -like this: - - $ git log --pretty=fuller --no-color --date=short --decorate=full -1000 | - ./git2changes.pl - -The older, manually edited, changelog is found in git named CHANGES.0 diff --git a/deps/cares/src/README b/deps/cares/src/README index 56a43c5..2c128c8 100644 --- a/deps/cares/src/README +++ b/deps/cares/src/README @@ -24,8 +24,6 @@ You'll find all c-ares details and news here: NOTES FOR C-ARES HACKERS -The following notes apply to c-ares version 1.7.0 and later. - * The distributed ares_build.h file is only intended to be used on systems which can not run the also distributed configure script. diff --git a/deps/cares/src/RELEASE-NOTES b/deps/cares/src/RELEASE-NOTES index 3c43730..1f3f0ef 100644 --- a/deps/cares/src/RELEASE-NOTES +++ b/deps/cares/src/RELEASE-NOTES @@ -1,16 +1,35 @@ -c-ares version 1.9.0 +c-ares version 1.10.0 -Changed: +Changes: - o Added ares_parse_soa_reply + o Added ares_create_query(), to be used instead of ares_mkquery() + o ares_inet_ntop() and ares_inet_pton() are now recognized c-ares functions -Fixed: +Bug fixes: - o libcares.pc generation for static MingW* cross builds - o ares_dup: UDP and TCP port byte order in saved options + o include the ares_parse_soa_reply.* files in the tarball + o read_udp_packets: bail out loop on bad sockets + o get_DNS_AdaptersAddresses: fix IPv6 parsing + o adig: perror() doesn't work for socket errors on windows + o ares_parse_aaaa_reply: fix memory leak + o setup_once.h: HP-UX issue workaround + o configure: several fixes + o config-dos.h: define strerror() to strerror_s_() for High-C + o config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32 + o ares_build.h.dist: enhance non-configure GCC ABI detection logic + o ares.h: stricter CARES_EXTERN linkage decorations logic + o ares_cancel(): cancel requests safely + o protocol parsing: check input data stricter + o library init: be recursive, reference count inits/cleanups + o ares_parse_txt_reply: return a ares_txt_reply node for each sub-string + o ares_set_servers_csv: fixed IPv6 address parsing + o build: fix build on msvc11 Thanks go to these friendly people for their efforts and contributions: - Yang Tse, Nick Alcock, Marko Kreen + Eugeny Gladkih, Yang Tse, Gisle Vanem, Guenter Knauf, Horatiu Popescu, + Alexander Klauer, Patrick Valsecchi, Paul Saab, Keith Shaw, + Alex Loukissas + Have fun! diff --git a/deps/cares/src/ares__close_sockets.c b/deps/cares/src/ares__close_sockets.c index 5d391a9..d3d85ff 100644 --- a/deps/cares/src/ares__close_sockets.c +++ b/deps/cares/src/ares__close_sockets.c @@ -16,11 +16,6 @@ #include "ares_setup.h" -#include -#ifdef HAVE_UNISTD_H -#include -#endif - #include "ares.h" #include "ares_private.h" diff --git a/deps/cares/src/ares__get_hostent.c b/deps/cares/src/ares__get_hostent.c index 94428ee..4497d60 100644 --- a/deps/cares/src/ares__get_hostent.c +++ b/deps/cares/src/ares__get_hostent.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -30,7 +27,7 @@ #endif #include "ares.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "ares_nowarn.h" #include "ares_private.h" diff --git a/deps/cares/src/ares__read_line.c b/deps/cares/src/ares__read_line.c index ca01803..bd9504f 100644 --- a/deps/cares/src/ares__read_line.c +++ b/deps/cares/src/ares__read_line.c @@ -15,9 +15,7 @@ */ #include "ares_setup.h" -#include -#include -#include + #include "ares.h" #include "ares_nowarn.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_cancel.c b/deps/cares/src/ares_cancel.c index eb790ae..465cc9e 100644 --- a/deps/cares/src/ares_cancel.c +++ b/deps/cares/src/ares_cancel.c @@ -14,7 +14,7 @@ #include "ares_setup.h" #include -#include + #include "ares.h" #include "ares_private.h" @@ -26,33 +26,33 @@ void ares_cancel(ares_channel channel) { struct query *query; + struct list_node list_head_copy; struct list_node* list_head; struct list_node* list_node; int i; - list_head = &(channel->all_queries); - for (list_node = list_head->next; list_node != list_head; ) + if (!ares__is_list_empty(&(channel->all_queries))) { - query = list_node->data; - list_node = list_node->next; /* since we're deleting the query */ - query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0); - ares__free_query(query); - } -#ifndef NDEBUG - /* Freeing the query should remove it from all the lists in which it sits, - * so all query lists should be empty now. - */ - assert(ares__is_list_empty(&(channel->all_queries))); - for (i = 0; i < ARES_QID_TABLE_SIZE; i++) + /* Swap list heads, so that only those queries which were present on entry + * into this function are cancelled. New queries added by callbacks of + * queries being cancelled will not be cancelled themselves. + */ + list_head = &(channel->all_queries); + list_head_copy.prev = list_head->prev; + list_head_copy.next = list_head->next; + list_head_copy.prev->next = &list_head_copy; + list_head_copy.next->prev = &list_head_copy; + list_head->prev = list_head; + list_head->next = list_head; + for (list_node = list_head_copy.next; list_node != &list_head_copy; ) { - assert(ares__is_list_empty(&(channel->queries_by_qid[i]))); + query = list_node->data; + list_node = list_node->next; /* since we're deleting the query */ + query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0); + ares__free_query(query); } - for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++) - { - assert(ares__is_list_empty(&(channel->queries_by_timeout[i]))); - } -#endif - if (!(channel->flags & ARES_FLAG_STAYOPEN)) + } + if (!(channel->flags & ARES_FLAG_STAYOPEN) && ares__is_list_empty(&(channel->all_queries))) { if (channel->servers) { diff --git a/deps/cares/src/ares_create_query.c b/deps/cares/src/ares_create_query.c new file mode 100644 index 0000000..8624e2f --- /dev/null +++ b/deps/cares/src/ares_create_query.c @@ -0,0 +1,208 @@ + +/* Copyright 1998 by the Massachusetts Institute of Technology. + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" + * without express or implied warranty. + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#else +# include "nameser.h" +#endif +#ifdef HAVE_ARPA_NAMESER_COMPAT_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" +#include "ares_private.h" + +#ifndef T_OPT +# define T_OPT 41 /* EDNS0 option (meta-RR) */ +#endif + +/* Header format, from RFC 1035: + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ID | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * |QR| Opcode |AA|TC|RD|RA| Z | RCODE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QDCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ANCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | NSCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ARCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * AA, TC, RA, and RCODE are only set in responses. Brief description + * of the remaining fields: + * ID Identifier to match responses with queries + * QR Query (0) or response (1) + * Opcode For our purposes, always QUERY + * RD Recursion desired + * Z Reserved (zero) + * QDCOUNT Number of queries + * ANCOUNT Number of answers + * NSCOUNT Number of name server records + * ARCOUNT Number of additional records + * + * Question format, from RFC 1035: + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * / QNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QTYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QCLASS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * The query name is encoded as a series of labels, each represented + * as a one-byte length (maximum 63) followed by the text of the + * label. The list is terminated by a label of length zero (which can + * be thought of as the root domain). + */ + +int ares_create_query(const char *name, int dnsclass, int type, + unsigned short id, int rd, unsigned char **buf, + int *buflen, int max_udp_size) +{ + int len; + unsigned char *q; + const char *p; + + /* Set our results early, in case we bail out early with an error. */ + *buflen = 0; + *buf = NULL; + + /* Compute the length of the encoded name so we can check buflen. + * Start counting at 1 for the zero-length label at the end. */ + len = 1; + for (p = name; *p; p++) + { + if (*p == '\\' && *(p + 1) != 0) + p++; + len++; + } + /* If there are n periods in the name, there are n + 1 labels, and + * thus n + 1 length fields, unless the name is empty or ends with a + * period. So add 1 unless name is empty or ends with a period. + */ + if (*name && *(p - 1) != '.') + len++; + + /* Immediately reject names that are longer than the maximum of 255 + * bytes that's specified in RFC 1035 ("To simplify implementations, + * the total length of a domain name (i.e., label octets and label + * length octets) is restricted to 255 octets or less."). We aren't + * doing this just to be a stickler about RFCs. For names that are + * too long, 'dnscache' closes its TCP connection to us immediately + * (when using TCP) and ignores the request when using UDP, and + * BIND's named returns ServFail (TCP or UDP). Sending a request + * that we know will cause 'dnscache' to close the TCP connection is + * painful, since that makes any other outstanding requests on that + * connection fail. And sending a UDP request that we know + * 'dnscache' will ignore is bad because resources will be tied up + * until we time-out the request. + */ + if (len > MAXCDNAME) + return ARES_EBADNAME; + + *buflen = len + HFIXEDSZ + QFIXEDSZ + (max_udp_size ? EDNSFIXEDSZ : 0); + *buf = malloc(*buflen); + if (!*buf) + return ARES_ENOMEM; + + /* Set up the header. */ + q = *buf; + memset(q, 0, HFIXEDSZ); + DNS_HEADER_SET_QID(q, id); + DNS_HEADER_SET_OPCODE(q, QUERY); + if (rd) { + DNS_HEADER_SET_RD(q, 1); + } + else { + DNS_HEADER_SET_RD(q, 0); + } + DNS_HEADER_SET_QDCOUNT(q, 1); + + if (max_udp_size) { + DNS_HEADER_SET_ARCOUNT(q, 1); + } + + /* A name of "." is a screw case for the loop below, so adjust it. */ + if (strcmp(name, ".") == 0) + name++; + + /* Start writing out the name after the header. */ + q += HFIXEDSZ; + while (*name) + { + if (*name == '.') + return ARES_EBADNAME; + + /* Count the number of bytes in this label. */ + len = 0; + for (p = name; *p && *p != '.'; p++) + { + if (*p == '\\' && *(p + 1) != 0) + p++; + len++; + } + if (len > MAXLABEL) + return ARES_EBADNAME; + + /* Encode the length and copy the data. */ + *q++ = (unsigned char)len; + for (p = name; *p && *p != '.'; p++) + { + if (*p == '\\' && *(p + 1) != 0) + p++; + *q++ = *p; + } + + /* Go to the next label and repeat, unless we hit the end. */ + if (!*p) + break; + name = p + 1; + } + + /* Add the zero-length label at the end. */ + *q++ = 0; + + /* Finish off the question with the type and class. */ + DNS_QUESTION_SET_TYPE(q, type); + DNS_QUESTION_SET_CLASS(q, dnsclass); + + if (max_udp_size) + { + q += QFIXEDSZ; + memset(q, 0, EDNSFIXEDSZ); + q++; + DNS_RR_SET_TYPE(q, T_OPT); + DNS_RR_SET_CLASS(q, max_udp_size); + } + + return ARES_SUCCESS; +} diff --git a/deps/cares/src/ares_data.c b/deps/cares/src/ares_data.c index 7c04650..b86ca90 100644 --- a/deps/cares/src/ares_data.c +++ b/deps/cares/src/ares_data.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2012 by Daniel Stenberg +/* Copyright (C) 2009-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -199,33 +199,3 @@ void *ares_malloc_data(ares_datatype type) return &ptr->data; } - - -/* -** ares_get_datatype() - c-ares internal helper function. -** -** This function returns the ares_datatype of the data stored in a -** private ares_data struct when given the public API pointer. -*/ - -ares_datatype ares_get_datatype(void * dataptr) -{ - struct ares_data *ptr; - -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:1684) - /* 1684: conversion from pointer to same-sized integral type */ -#endif - - ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data)); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif - - if (ptr->mark == ARES_DATATYPE_MARK) - return ptr->type; - - return ARES_DATATYPE_UNKNOWN; -} diff --git a/deps/cares/src/ares_data.h b/deps/cares/src/ares_data.h index 8974295..12e3b67 100644 --- a/deps/cares/src/ares_data.h +++ b/deps/cares/src/ares_data.h @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2012 by Daniel Stenberg +/* Copyright (C) 2009-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -66,4 +66,3 @@ struct ares_data { void *ares_malloc_data(ares_datatype type); -ares_datatype ares_get_datatype(void * dataptr); diff --git a/deps/cares/src/ares_destroy.c b/deps/cares/src/ares_destroy.c index a3f6ea2..6c1f324 100644 --- a/deps/cares/src/ares_destroy.c +++ b/deps/cares/src/ares_destroy.c @@ -16,8 +16,9 @@ */ #include "ares_setup.h" + #include -#include + #include "ares.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_dns.h b/deps/cares/src/ares_dns.h index 34cf790..79f993b 100644 --- a/deps/cares/src/ares_dns.h +++ b/deps/cares/src/ares_dns.h @@ -95,9 +95,9 @@ #define DNS_RR_LEN(r) DNS__16BIT((r) + 8) /* Macros for constructing the fixed part of a DNS resource record */ -#define DNS_RR_SET_TYPE(r) DNS__SET16BIT(r, v) -#define DNS_RR_SET_CLASS(r) DNS__SET16BIT((r) + 2, v) -#define DNS_RR_SET_TTL(r) DNS__SET32BIT((r) + 4, v) -#define DNS_RR_SET_LEN(r) DNS__SET16BIT((r) + 8, v) +#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) +#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) +#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) +#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) #endif /* HEADER_CARES_DNS_H */ diff --git a/deps/cares/src/ares_expand_name.c b/deps/cares/src/ares_expand_name.c index 71ff0da..2aa12bc 100644 --- a/deps/cares/src/ares_expand_name.c +++ b/deps/cares/src/ares_expand_name.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -31,7 +28,6 @@ # include #endif -#include #include "ares.h" #include "ares_nowarn.h" #include "ares_private.h" /* for the memdebug */ @@ -147,7 +143,7 @@ static int name_length(const unsigned char *encoded, const unsigned char *abuf, int n = 0, offset, indir = 0; /* Allow the caller to pass us abuf + alen and have us check for it. */ - if (encoded == abuf + alen) + if (encoded >= abuf + alen) return -1; while (*encoded) diff --git a/deps/cares/src/ares_expand_string.c b/deps/cares/src/ares_expand_string.c index f24cccf..96d1be3 100644 --- a/deps/cares/src/ares_expand_string.c +++ b/deps/cares/src/ares_expand_string.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -28,8 +25,6 @@ # include "nameser.h" #endif -#include -#include #include "ares.h" #include "ares_private.h" /* for the memdebug */ diff --git a/deps/cares/src/ares_fds.c b/deps/cares/src/ares_fds.c index ac5eedb..f405fc0 100644 --- a/deps/cares/src/ares_fds.c +++ b/deps/cares/src/ares_fds.c @@ -16,10 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif - #include "ares.h" #include "ares_nowarn.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_free_hostent.c b/deps/cares/src/ares_free_hostent.c index 349d379..7f44882 100644 --- a/deps/cares/src/ares_free_hostent.c +++ b/deps/cares/src/ares_free_hostent.c @@ -15,7 +15,6 @@ */ #include "ares_setup.h" -#include #ifdef HAVE_NETDB_H #include diff --git a/deps/cares/src/ares_free_string.c b/deps/cares/src/ares_free_string.c index e0545c1..9441089 100644 --- a/deps/cares/src/ares_free_string.c +++ b/deps/cares/src/ares_free_string.c @@ -15,7 +15,7 @@ */ #include "ares_setup.h" -#include + #include "ares.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_gethostbyaddr.c b/deps/cares/src/ares_gethostbyaddr.c index 4b4c8a7..85862e2 100644 --- a/deps/cares/src/ares_gethostbyaddr.c +++ b/deps/cares/src/ares_gethostbyaddr.c @@ -15,9 +15,6 @@ */ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -36,12 +33,8 @@ # include #endif -#include -#include -#include - #include "ares.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "ares_platform.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_gethostbyname.c b/deps/cares/src/ares_gethostbyname.c index 4869402..2b27b2e 100644 --- a/deps/cares/src/ares_gethostbyname.c +++ b/deps/cares/src/ares_gethostbyname.c @@ -1,5 +1,5 @@ -/* Copyright 1998, 2011 by the Massachusetts Institute of Technology. +/* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology. * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -37,16 +34,12 @@ # include #endif -#include -#include -#include -#include #ifdef HAVE_STRINGS_H #include #endif #include "ares.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "bitncmp.h" #include "ares_platform.h" #include "ares_nowarn.h" @@ -467,8 +460,8 @@ static int get_address_index(const struct in_addr *addr, } else { - if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr, - sortlist[i].mask.bits)) + if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr, + sortlist[i].mask.bits)) break; } } @@ -515,10 +508,8 @@ static int get6_address_index(const struct ares_in6_addr *addr, { if (sortlist[i].family != AF_INET6) continue; - if (!ares_bitncmp(addr, - &sortlist[i].addrV6, - sortlist[i].mask.bits)) - break; + if (!ares__bitncmp(addr, &sortlist[i].addrV6, sortlist[i].mask.bits)) + break; } return i; } diff --git a/deps/cares/src/ares_getnameinfo.c b/deps/cares/src/ares_getnameinfo.c index cdcd516..5b9f638 100644 --- a/deps/cares/src/ares_getnameinfo.c +++ b/deps/cares/src/ares_getnameinfo.c @@ -22,9 +22,6 @@ # endif #endif -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -47,17 +44,8 @@ #include #endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include -#include -#include - #include "ares.h" #include "ares_ipv6.h" -#include "inet_ntop.h" #include "ares_nowarn.h" #include "ares_private.h" diff --git a/deps/cares/src/ares_getsock.c b/deps/cares/src/ares_getsock.c index 72e467f..07d2854 100644 --- a/deps/cares/src/ares_getsock.c +++ b/deps/cares/src/ares_getsock.c @@ -14,10 +14,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif - #include "ares.h" #include "ares_private.h" diff --git a/deps/cares/src/inet_net_pton.h b/deps/cares/src/ares_inet_net_pton.h similarity index 82% rename from deps/cares/src/inet_net_pton.h rename to deps/cares/src/ares_inet_net_pton.h index 5396a7f..90da2cc 100644 --- a/deps/cares/src/inet_net_pton.h +++ b/deps/cares/src/ares_inet_net_pton.h @@ -1,7 +1,7 @@ #ifndef HEADER_CARES_INET_NET_PTON_H #define HEADER_CARES_INET_NET_PTON_H -/* Copyright (C) 2005-2010 by Daniel Stenberg et al +/* Copyright (C) 2005-2013 by Daniel Stenberg et al * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -16,12 +16,6 @@ * without express or implied warranty. */ -#ifdef HAVE_INET_PTON -#define ares_inet_pton(x,y,z) inet_pton(x,y,z) -#else -int ares_inet_pton(int af, const char *src, void *dst); -#endif - #ifdef HAVE_INET_NET_PTON #define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z) #else diff --git a/deps/cares/src/ares_init.c b/deps/cares/src/ares_init.c index 4aef21a..d23c1b0 100644 --- a/deps/cares/src/ares_init.c +++ b/deps/cares/src/ares_init.c @@ -1,6 +1,6 @@ /* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2012 by Daniel Stenberg + * Copyright (C) 2007-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -21,14 +21,6 @@ #include #endif -#ifdef HAVE_SYS_TIME_H -#include -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - #ifdef HAVE_NETINET_IN_H #include #endif @@ -50,16 +42,6 @@ # include #endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#include -#include -#include -#include -#include - #if defined(ANDROID) || defined(__ANDROID__) #include /* From the Bionic sources */ @@ -68,8 +50,7 @@ #endif #include "ares.h" -#include "inet_ntop.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "ares_library_init.h" #include "ares_nowarn.h" #include "ares_platform.h" @@ -163,6 +144,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, channel->rotate = -1; channel->udp_port = -1; channel->tcp_port = -1; + channel->ednspsz = -1; channel->socket_send_buffer_size = -1; channel->socket_receive_buffer_size = -1; channel->nservers = -1; @@ -453,6 +435,9 @@ static int init_by_options(ares_channel channel, && channel->socket_receive_buffer_size == -1) channel->socket_receive_buffer_size = options->socket_receive_buffer_size; + if ((optmask & ARES_OPT_EDNSPSZ) && channel->ednspsz == -1) + channel->ednspsz = options->ednspsz; + /* Copy the IPv4 servers, if given. */ if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) { @@ -1012,15 +997,10 @@ static int get_DNS_AdaptersAddresses(char **outptr) } else if (namesrvr.sa->sa_family == AF_INET6) { - /* Windows apparently always reports some IPv6 DNS servers that - * prefixed with fec0:0:0:ffff. These ususally do not point to - * working DNS servers, so we ignore them. */ - if (strncmp(txtaddr, "fec0:0:0:ffff:", 14) == 0) - continue; if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any, sizeof(namesrvr.sa6->sin6_addr)) == 0) continue; - if (! ares_inet_ntop(AF_INET, &namesrvr.sa6->sin6_addr, + if (! ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, txtaddr, sizeof(txtaddr))) continue; } @@ -1363,6 +1343,9 @@ static int init_by_defaults(ares_channel channel) if (channel->tcp_port == -1) channel->tcp_port = htons(NAMESERVER_PORT); + if (channel->ednspsz == -1) + channel->ednspsz = EDNSPACKETSZ; + if (channel->nservers == -1) { /* If nobody specified servers, try a local named. */ channel->servers = malloc(sizeof(struct server_state)); @@ -1960,13 +1943,6 @@ static int init_id_key(rc4_key* key,int key_data_len) return ARES_SUCCESS; } -unsigned short ares__generate_new_id(rc4_key* key) -{ - unsigned short r=0; - ares__rc4(key, (unsigned char *)&r, sizeof(r)); - return r; -} - void ares_set_local_ip4(ares_channel channel, unsigned int local_ip) { channel->local_ip4 = local_ip; diff --git a/deps/cares/src/ares_library_init.c b/deps/cares/src/ares_library_init.c index f0137a1..770e7c2 100644 --- a/deps/cares/src/ares_library_init.c +++ b/deps/cares/src/ares_library_init.c @@ -101,7 +101,10 @@ int ares_library_init(int flags) int res; if (ares_initialized) - return ARES_SUCCESS; + { + ares_initialized++; + return ARES_SUCCESS; + } ares_initialized++; if (flags & ARES_LIB_INIT_WIN32) @@ -122,6 +125,8 @@ void ares_library_cleanup(void) if (!ares_initialized) return; ares_initialized--; + if (ares_initialized) + return; if (ares_init_flags & ARES_LIB_INIT_WIN32) ares_win32_cleanup(); diff --git a/deps/cares/src/ares_llist.c b/deps/cares/src/ares_llist.c index c0acd90..36ca84c 100644 --- a/deps/cares/src/ares_llist.c +++ b/deps/cares/src/ares_llist.c @@ -61,26 +61,3 @@ void ares__remove_from_list(struct list_node* node) { } } -/* Swap the contents of two lists */ -void ares__swap_lists(struct list_node* head_a, - struct list_node* head_b) { - int is_a_empty = ares__is_list_empty(head_a); - int is_b_empty = ares__is_list_empty(head_b); - struct list_node old_a = *head_a; - struct list_node old_b = *head_b; - - if (is_a_empty) { - ares__init_list_head(head_b); - } else { - *head_b = old_a; - old_a.next->prev = head_b; - old_a.prev->next = head_b; - } - if (is_b_empty) { - ares__init_list_head(head_a); - } else { - *head_a = old_b; - old_b.next->prev = head_a; - old_b.prev->next = head_a; - } -} diff --git a/deps/cares/src/ares_llist.h b/deps/cares/src/ares_llist.h index b09f0de..20f4d1c 100644 --- a/deps/cares/src/ares_llist.h +++ b/deps/cares/src/ares_llist.h @@ -36,7 +36,4 @@ void ares__insert_in_list(struct list_node* new_node, void ares__remove_from_list(struct list_node* node); -void ares__swap_lists(struct list_node* head_a, - struct list_node* head_b); - #endif /* __ARES_LLIST_H */ diff --git a/deps/cares/src/ares_mkquery.c b/deps/cares/src/ares_mkquery.c index e33f13f..5aea914 100644 --- a/deps/cares/src/ares_mkquery.c +++ b/deps/cares/src/ares_mkquery.c @@ -15,181 +15,10 @@ */ #include "ares_setup.h" - -#ifdef HAVE_SYS_SOCKET_H -# include -#endif -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include -#else -# include "nameser.h" -#endif -#ifdef HAVE_ARPA_NAMESER_COMPAT_H -# include -#endif - -#include -#include #include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -/* Header format, from RFC 1035: - * 1 1 1 1 1 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ID | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * |QR| Opcode |AA|TC|RD|RA| Z | RCODE | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QDCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ANCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | NSCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ARCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - * AA, TC, RA, and RCODE are only set in responses. Brief description - * of the remaining fields: - * ID Identifier to match responses with queries - * QR Query (0) or response (1) - * Opcode For our purposes, always QUERY - * RD Recursion desired - * Z Reserved (zero) - * QDCOUNT Number of queries - * ANCOUNT Number of answers - * NSCOUNT Number of name server records - * ARCOUNT Number of additional records - * - * Question format, from RFC 1035: - * 1 1 1 1 1 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | | - * / QNAME / - * / / - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QTYPE | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QCLASS | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - * The query name is encoded as a series of labels, each represented - * as a one-byte length (maximum 63) followed by the text of the - * label. The list is terminated by a label of length zero (which can - * be thought of as the root domain). - */ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, int rd, unsigned char **buf, int *buflen) { - int len; - unsigned char *q; - const char *p; - - /* Set our results early, in case we bail out early with an error. */ - *buflen = 0; - *buf = NULL; - - /* Compute the length of the encoded name so we can check buflen. - * Start counting at 1 for the zero-length label at the end. */ - len = 1; - for (p = name; *p; p++) - { - if (*p == '\\' && *(p + 1) != 0) - p++; - len++; - } - /* If there are n periods in the name, there are n + 1 labels, and - * thus n + 1 length fields, unless the name is empty or ends with a - * period. So add 1 unless name is empty or ends with a period. - */ - if (*name && *(p - 1) != '.') - len++; - - /* Immediately reject names that are longer than the maximum of 255 - * bytes that's specified in RFC 1035 ("To simplify implementations, - * the total length of a domain name (i.e., label octets and label - * length octets) is restricted to 255 octets or less."). We aren't - * doing this just to be a stickler about RFCs. For names that are - * too long, 'dnscache' closes its TCP connection to us immediately - * (when using TCP) and ignores the request when using UDP, and - * BIND's named returns ServFail (TCP or UDP). Sending a request - * that we know will cause 'dnscache' to close the TCP connection is - * painful, since that makes any other outstanding requests on that - * connection fail. And sending a UDP request that we know - * 'dnscache' will ignore is bad because resources will be tied up - * until we time-out the request. - */ - if (len > MAXCDNAME) - return ARES_EBADNAME; - - *buflen = len + HFIXEDSZ + QFIXEDSZ; - *buf = malloc(*buflen); - if (!*buf) - return ARES_ENOMEM; - - /* Set up the header. */ - q = *buf; - memset(q, 0, HFIXEDSZ); - DNS_HEADER_SET_QID(q, id); - DNS_HEADER_SET_OPCODE(q, QUERY); - if (rd) { - DNS_HEADER_SET_RD(q, 1); - } - else { - DNS_HEADER_SET_RD(q, 0); - } - DNS_HEADER_SET_QDCOUNT(q, 1); - - /* A name of "." is a screw case for the loop below, so adjust it. */ - if (strcmp(name, ".") == 0) - name++; - - /* Start writing out the name after the header. */ - q += HFIXEDSZ; - while (*name) - { - if (*name == '.') - return ARES_EBADNAME; - - /* Count the number of bytes in this label. */ - len = 0; - for (p = name; *p && *p != '.'; p++) - { - if (*p == '\\' && *(p + 1) != 0) - p++; - len++; - } - if (len > MAXLABEL) - return ARES_EBADNAME; - - /* Encode the length and copy the data. */ - *q++ = (unsigned char)len; - for (p = name; *p && *p != '.'; p++) - { - if (*p == '\\' && *(p + 1) != 0) - p++; - *q++ = *p; - } - - /* Go to the next label and repeat, unless we hit the end. */ - if (!*p) - break; - name = p + 1; - } - - /* Add the zero-length label at the end. */ - *q++ = 0; - - /* Finish off the question with the type and class. */ - DNS_QUESTION_SET_TYPE(q, type); - DNS_QUESTION_SET_CLASS(q, dnsclass); - - return ARES_SUCCESS; + return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0); } diff --git a/deps/cares/src/ares_nowarn.c b/deps/cares/src/ares_nowarn.c index e29efd3..397e70b 100644 --- a/deps/cares/src/ares_nowarn.c +++ b/deps/cares/src/ares_nowarn.c @@ -23,9 +23,6 @@ #if defined(__INTEL_COMPILER) && defined(__unix__) -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif diff --git a/deps/cares/src/ares_options.c b/deps/cares/src/ares_options.c index 5174ef2..76d82df 100644 --- a/deps/cares/src/ares_options.c +++ b/deps/cares/src/ares_options.c @@ -1,6 +1,6 @@ /* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2008-2011 by Daniel Stenberg + * Copyright (C) 2008-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -24,7 +24,7 @@ #include "ares.h" #include "ares_data.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "ares_private.h" @@ -132,6 +132,7 @@ int ares_set_servers(ares_channel channel, } /* Incomming string format: host[:port][,host[:port]]... */ +/* IPv6 addresses with ports require square brackets [fe80::1%lo0]:53 */ int ares_set_servers_csv(ares_channel channel, const char* _csv) { @@ -139,6 +140,7 @@ int ares_set_servers_csv(ares_channel channel, char* csv = NULL; char* ptr; char* start_host; + int cc = 0; int rv = ARES_SUCCESS; struct ares_addr_node *servers = NULL; struct ares_addr_node *last = NULL; @@ -164,28 +166,53 @@ int ares_set_servers_csv(ares_channel channel, start_host = csv; for (ptr = csv; *ptr; ptr++) { - if (*ptr == ',') { + if (*ptr == ':') { + /* count colons to determine if we have an IPv6 number or IPv4 with + port */ + cc++; + } + else if (*ptr == '[') { + /* move start_host if an open square bracket is found wrapping an IPv6 + address */ + start_host = ptr + 1; + } + else if (*ptr == ',') { char* pp = ptr - 1; + char* p = ptr; struct in_addr in4; struct ares_in6_addr in6; struct ares_addr_node *s = NULL; *ptr = 0; /* null terminate host:port string */ - /* Got an entry..see if port was specified. */ - while (pp > start_host) { - if (*pp == ':') - break; /* yes */ - if (!ISDIGIT(*pp)) { - /* Found end of digits before we found :, so wasn't a port */ - pp = ptr; - break; + /* Got an entry..see if the port was specified. */ + if (cc > 0) { + while (pp > start_host) { + /* a single close square bracket followed by a colon, ']:' indicates + an IPv6 address with port */ + if ((*pp == ']') && (*p == ':')) + break; /* found port */ + /* a single colon, ':' indicates an IPv4 address with port */ + if ((*pp == ':') && (cc == 1)) + break; /* found port */ + if (!(ISDIGIT(*pp) || (*pp == ':'))) { + /* Found end of digits before we found :, so wasn't a port */ + /* must allow ':' for IPv6 case of ']:' indicates we found a port */ + pp = p = ptr; + break; + } + pp--; + p--; + } + if ((pp != start_host) && ((pp + 1) < ptr)) { + /* Found it. Parse over the port number */ + /* when an IPv6 address is wrapped with square brackets the port + starts at pp + 2 */ + if (*pp == ']') + p++; /* move p before ':' */ + /* p will point to the start of the port */ + (void)strtol(p, NULL, 10); + *pp = 0; /* null terminate host */ } - pp--; - } - if ((pp != start_host) && ((pp + 1) < ptr)) { - /* Found it. Parse over the port number */ - (void)strtol(pp + 1, NULL, 10); - *pp = 0; /* null terminate host */ } /* resolve host, try ipv4 first, rslt is in network byte order */ rv = ares_inet_pton(AF_INET, start_host, &in4); @@ -221,6 +248,8 @@ int ares_set_servers_csv(ares_channel channel, s->next = NULL; if (last) { last->next = s; + /* need to move last to maintain the linked list */ + last = last->next; } else { servers = s; @@ -230,6 +259,7 @@ int ares_set_servers_csv(ares_channel channel, /* Set up for next one */ start_host = ptr + 1; + cc = 0; } } diff --git a/deps/cares/src/ares_parse_a_reply.c b/deps/cares/src/ares_parse_a_reply.c index 4bd0845..a3ed69e 100644 --- a/deps/cares/src/ares_parse_a_reply.c +++ b/deps/cares/src/ares_parse_a_reply.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -41,8 +38,6 @@ # include #endif -#include -#include #ifdef HAVE_LIMITS_H # include #endif @@ -141,6 +136,12 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, rr_len = DNS_RR_LEN(aptr); rr_ttl = DNS_RR_TTL(aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + free(rr_name); + status = ARES_EBADRESP; + break; + } if (rr_class == C_IN && rr_type == T_A && rr_len == sizeof(struct in_addr) diff --git a/deps/cares/src/ares_parse_aaaa_reply.c b/deps/cares/src/ares_parse_aaaa_reply.c index b11df52..31e4a8c 100644 --- a/deps/cares/src/ares_parse_aaaa_reply.c +++ b/deps/cares/src/ares_parse_aaaa_reply.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -42,15 +39,13 @@ # include #endif -#include -#include #ifdef HAVE_LIMITS_H # include #endif #include "ares.h" #include "ares_dns.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" #include "ares_private.h" int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, @@ -141,6 +136,12 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, rr_len = DNS_RR_LEN(aptr); rr_ttl = DNS_RR_TTL(aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + free(rr_name); + status = ARES_EBADRESP; + break; + } if (rr_class == C_IN && rr_type == T_AAAA && rr_len == sizeof(struct ares_in6_addr) @@ -241,6 +242,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, for (i = 0; i < naddrs; i++) hostent->h_addr_list[i] = (char *) &addrs[i]; hostent->h_addr_list[naddrs] = NULL; + if (!naddrs && addrs) + free(addrs); *host = hostent; return ARES_SUCCESS; } diff --git a/deps/cares/src/ares_parse_mx_reply.c b/deps/cares/src/ares_parse_mx_reply.c index 2180054..95400dd 100644 --- a/deps/cares/src/ares_parse_mx_reply.c +++ b/deps/cares/src/ares_parse_mx_reply.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -38,8 +35,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_data.h" @@ -105,6 +100,11 @@ ares_parse_mx_reply (const unsigned char *abuf, int alen, rr_class = DNS_RR_CLASS (aptr); rr_len = DNS_RR_LEN (aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + status = ARES_EBADRESP; + break; + } /* Check if we are really looking at a MX record */ if (rr_class == C_IN && rr_type == T_MX) diff --git a/deps/cares/src/ares_parse_naptr_reply.c b/deps/cares/src/ares_parse_naptr_reply.c index 6a9d09e..4935366 100644 --- a/deps/cares/src/ares_parse_naptr_reply.c +++ b/deps/cares/src/ares_parse_naptr_reply.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -38,8 +35,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_data.h" @@ -110,6 +105,11 @@ ares_parse_naptr_reply (const unsigned char *abuf, int alen, rr_class = DNS_RR_CLASS (aptr); rr_len = DNS_RR_LEN (aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + status = ARES_EBADRESP; + break; + } /* Check if we are really looking at a NAPTR record */ if (rr_class == C_IN && rr_type == T_NAPTR) diff --git a/deps/cares/src/ares_parse_ns_reply.c b/deps/cares/src/ares_parse_ns_reply.c index 5e9af71..d331e67 100644 --- a/deps/cares/src/ares_parse_ns_reply.c +++ b/deps/cares/src/ares_parse_ns_reply.c @@ -20,9 +20,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -41,8 +38,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_private.h" @@ -110,6 +105,12 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen, rr_class = DNS_RR_CLASS( aptr ); rr_len = DNS_RR_LEN( aptr ); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + free(rr_name); + status = ARES_EBADRESP; + break; + } if ( rr_class == C_IN && rr_type == T_NS ) { diff --git a/deps/cares/src/ares_parse_ptr_reply.c b/deps/cares/src/ares_parse_ptr_reply.c index ed4a405..df21e40 100644 --- a/deps/cares/src/ares_parse_ptr_reply.c +++ b/deps/cares/src/ares_parse_ptr_reply.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -38,8 +35,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_nowarn.h" @@ -108,6 +103,12 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, rr_class = DNS_RR_CLASS(aptr); rr_len = DNS_RR_LEN(aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + free(rr_name); + status = ARES_EBADRESP; + break; + } if (rr_class == C_IN && rr_type == T_PTR && strcasecmp(rr_name, ptrname) == 0) @@ -208,7 +209,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, status = ARES_ENOMEM; } for (i=0 ; i -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -38,8 +35,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_data.h" diff --git a/deps/cares/src/ares_parse_srv_reply.c b/deps/cares/src/ares_parse_srv_reply.c index 9c7eb6e..0739c27 100644 --- a/deps/cares/src/ares_parse_srv_reply.c +++ b/deps/cares/src/ares_parse_srv_reply.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -38,8 +35,6 @@ # include #endif -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_data.h" @@ -110,6 +105,11 @@ ares_parse_srv_reply (const unsigned char *abuf, int alen, rr_class = DNS_RR_CLASS (aptr); rr_len = DNS_RR_LEN (aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + status = ARES_EBADRESP; + break; + } /* Check if we are really looking at a SRV record */ if (rr_class == C_IN && rr_type == T_SRV) diff --git a/deps/cares/src/ares_parse_txt_reply.c b/deps/cares/src/ares_parse_txt_reply.c index 5165332..981db4c 100644 --- a/deps/cares/src/ares_parse_txt_reply.c +++ b/deps/cares/src/ares_parse_txt_reply.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -42,9 +39,6 @@ # include #endif -#include -#include - #include "ares.h" #include "ares_dns.h" #include "ares_data.h" @@ -54,7 +48,7 @@ int ares_parse_txt_reply (const unsigned char *abuf, int alen, struct ares_txt_reply **txt_out) { - size_t substr_len, str_len; + size_t substr_len; unsigned int qdcount, ancount, i; const unsigned char *aptr; const unsigned char *strptr; @@ -112,27 +106,15 @@ ares_parse_txt_reply (const unsigned char *abuf, int alen, rr_class = DNS_RR_CLASS (aptr); rr_len = DNS_RR_LEN (aptr); aptr += RRFIXEDSZ; + if (aptr + rr_len > abuf + alen) + { + status = ARES_EBADRESP; + break; + } /* Check if we are really looking at a TXT record */ if (rr_class == C_IN && rr_type == T_TXT) { - /* Allocate storage for this TXT answer appending it to the list */ - txt_curr = ares_malloc_data(ARES_DATATYPE_TXT_REPLY); - if (!txt_curr) - { - status = ARES_ENOMEM; - break; - } - if (txt_last) - { - txt_last->next = txt_curr; - } - else - { - txt_head = txt_curr; - } - txt_last = txt_curr; - /* * There may be multiple substrings in a single TXT record. Each * substring may be up to 255 characters in length, with a @@ -141,36 +123,49 @@ ares_parse_txt_reply (const unsigned char *abuf, int alen, * substrings contained therein. */ - /* Compute total length to allow a single memory allocation */ strptr = aptr; while (strptr < (aptr + rr_len)) { substr_len = (unsigned char)*strptr; - txt_curr->length += substr_len; - strptr += substr_len + 1; - } - - /* Including null byte */ - txt_curr->txt = malloc (txt_curr->length + 1); - if (txt_curr->txt == NULL) - { - status = ARES_ENOMEM; - break; - } + if (strptr + substr_len + 1 > aptr + rr_len) + { + status = ARES_EBADRESP; + break; + } + + ++strptr; + + /* Allocate storage for this TXT answer appending it to the list */ + txt_curr = ares_malloc_data(ARES_DATATYPE_TXT_REPLY); + if (!txt_curr) + { + status = ARES_ENOMEM; + break; + } + if (txt_last) + { + txt_last->next = txt_curr; + } + else + { + txt_head = txt_curr; + } + txt_last = txt_curr; + + txt_curr->length = substr_len; + txt_curr->txt = malloc (substr_len + 1/* Including null byte */); + if (txt_curr->txt == NULL) + { + status = ARES_ENOMEM; + break; + } + memcpy ((char *) txt_curr->txt, strptr, substr_len); + + /* Make sure we NULL-terminate */ + txt_curr->txt[substr_len] = 0; - /* Step through the list of substrings, concatenating them */ - str_len = 0; - strptr = aptr; - while (strptr < (aptr + rr_len)) - { - substr_len = (unsigned char)*strptr; - strptr++; - memcpy ((char *) txt_curr->txt + str_len, strptr, substr_len); - str_len += substr_len; strptr += substr_len; } - /* Make sure we NULL-terminate */ - *((char *) txt_curr->txt + txt_curr->length) = '\0'; } /* Don't lose memory in the next iteration */ diff --git a/deps/cares/src/ares_private.h b/deps/cares/src/ares_private.h index 3c56bbc..ab5be5a 100644 --- a/deps/cares/src/ares_private.h +++ b/deps/cares/src/ares_private.h @@ -26,9 +26,6 @@ #define WIN32 #endif -#include -#include - #ifdef HAVE_NETINET_IN_H #include #endif @@ -40,10 +37,6 @@ #define HAVE_WRITEV 1 #endif -#ifdef NETWARE -#include -#endif - #define DEFAULT_TIMEOUT 5000 /* milliseconds */ #define DEFAULT_TRIES 4 #ifndef INADDR_NONE @@ -113,6 +106,13 @@ # define writev(s,ptr,cnt) ares_writev(s,ptr,cnt) #endif +/********* EDNS defines section ******/ +#define EDNSPACKETSZ 1280 /* Reasonable UDP payload size, as suggested + in RFC2671 */ +#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */ +#define EDNSFIXEDSZ 11 /* Size of EDNS header */ +/********* EDNS defines section ******/ + struct ares_addr { int family; union { @@ -260,6 +260,7 @@ struct ares_channeldata { struct apattern *sortlist; int nsort; char *lookups; + int ednspsz; /* For binding to local devices and/or IP addresses. Leave * them null/zero for no binding. @@ -317,7 +318,6 @@ long ares__timeoffset(struct timeval *now, struct timeval *check); /* returns ARES_SUCCESS if library has been initialized */ int ares_library_initialized(void); -void ares__rc4(rc4_key* key,unsigned char *buffer_ptr, int buffer_len); void ares__send_query(ares_channel channel, struct query *query, struct timeval *now); void ares__close_sockets(ares_channel channel, struct server_state *server); @@ -349,6 +349,7 @@ long ares__tvdiff(struct timeval t1, struct timeval t2); libcurl lowlevel code from within library is ugly and only works when c-ares is built and linked with a similarly curldebug-enabled libcurl, but we do this anyway for convenience. */ +#define HEADER_CURL_SETUP_ONCE_H #include "../lib/memdebug.h" #endif diff --git a/deps/cares/src/ares_process.c b/deps/cares/src/ares_process.c index 79a999f..bbeca5e 100644 --- a/deps/cares/src/ares_process.c +++ b/deps/cares/src/ares_process.c @@ -1,6 +1,6 @@ /* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2012 by Daniel Stenberg + * Copyright (C) 2004-2013 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_SYS_UIO_H # include #endif @@ -41,16 +38,9 @@ # include #endif -#ifdef HAVE_SYS_TIME_H -# include -#endif - #ifdef HAVE_STRINGS_H # include #endif -#ifdef HAVE_UNISTD_H -# include -#endif #ifdef HAVE_SYS_IOCTL_H # include #endif @@ -59,10 +49,7 @@ #endif #include -#include -#include #include -#include #include "ares.h" #include "ares_dns.h" @@ -268,7 +255,7 @@ static void write_tcp_data(ares_channel channel, if (wcount < 0) { if (!try_again(SOCKERRNO)) - handle_error(channel, i, now); + handle_error(channel, i, now); continue; } @@ -284,7 +271,7 @@ static void write_tcp_data(ares_channel channel, if (scount < 0) { if (!try_again(SOCKERRNO)) - handle_error(channel, i, now); + handle_error(channel, i, now); continue; } @@ -356,11 +343,11 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, } if(read_fds) - /* If there's an error and we close this socket, then open - * another with the same fd to talk to another server, then we - * don't want to think that it was the new socket that was - * ready. This is not disastrous, but is likely to result in - * extra system calls and confusion. */ + /* If there's an error and we close this socket, then open another + * with the same fd to talk to another server, then we don't want to + * think that it was the new socket that was ready. This is not + * disastrous, but is likely to result in extra system calls and + * confusion. */ FD_CLR(server->tcp_socket, read_fds); if (server->tcp_lenbuf_pos != 2) @@ -374,7 +361,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, if (count <= 0) { if (!(count == -1 && try_again(SOCKERRNO))) - handle_error(channel, i, now); + handle_error(channel, i, now); continue; } @@ -401,7 +388,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, if (count <= 0) { if (!(count == -1 && try_again(SOCKERRNO))) - handle_error(channel, i, now); + handle_error(channel, i, now); continue; } @@ -430,7 +417,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, struct server_state *server; int i; ssize_t count; - unsigned char buf[PACKETSZ + 1]; + unsigned char buf[MAXENDSSZ + 1]; #ifdef HAVE_RECVFROM ares_socklen_t fromlen; union { @@ -472,25 +459,31 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, /* To reduce event loop overhead, read and process as many * packets as we can. */ do { + if (server->udp_socket == ARES_SOCKET_BAD) + count = 0; + + else { #ifdef HAVE_RECVFROM - if (server->addr.family == AF_INET) - fromlen = sizeof(from.sa4); - else - fromlen = sizeof(from.sa6); - count = (ssize_t)recvfrom(server->udp_socket, (void *)buf, sizeof(buf), - 0, &from.sa, &fromlen); + if (server->addr.family == AF_INET) + fromlen = sizeof(from.sa4); + else + fromlen = sizeof(from.sa6); + count = (ssize_t)recvfrom(server->udp_socket, (void *)buf, + sizeof(buf), 0, &from.sa, &fromlen); #else - count = sread(server->udp_socket, buf, sizeof(buf)); + count = sread(server->udp_socket, buf, sizeof(buf)); #endif + } + if (count == -1 && try_again(SOCKERRNO)) continue; else if (count <= 0) handle_error(channel, i, now); #ifdef HAVE_RECVFROM else if (!same_address(&from.sa, &server->addr)) - /* The address the response comes from does not match - * the address we sent the request to. Someone may be - * attempting to perform a cache poisoning attack. */ + /* The address the response comes from does not match the address we + * sent the request to. Someone may be attempting to perform a cache + * poisoning attack. */ break; #endif else @@ -507,11 +500,10 @@ static void process_timeouts(ares_channel channel, struct timeval *now) struct list_node* list_head; struct list_node* list_node; - /* Process all the timeouts that have fired since the last time we - * processed timeouts. If things are going well, then we'll have - * hundreds/thousands of queries that fall into future buckets, and - * only a handful of requests that fall into the "now" bucket, so - * this should be quite quick. + /* Process all the timeouts that have fired since the last time we processed + * timeouts. If things are going well, then we'll have hundreds/thousands of + * queries that fall into future buckets, and only a handful of requests + * that fall into the "now" bucket, so this should be quite quick. */ for (t = channel->last_timeout_processed; t <= now->tv_sec; t++) { @@ -536,7 +528,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf, int alen, int whichserver, int tcp, struct timeval *now) { - int tc, rcode; + int tc, rcode, packetsz; unsigned short id; struct query *query; struct list_node* list_head; @@ -553,11 +545,10 @@ static void process_answer(ares_channel channel, unsigned char *abuf, rcode = DNS_HEADER_RCODE(abuf); /* Find the query corresponding to this packet. The queries are - * hashed/bucketed by query id, so this lookup should be quick. - * Note that both the query id and the questions must be the same; - * when the query id wraps around we can have multiple outstanding - * queries with the same query id, so we need to check both the id and - * question. + * hashed/bucketed by query id, so this lookup should be quick. Note that + * both the query id and the questions must be the same; when the query id + * wraps around we can have multiple outstanding queries with the same query + * id, so we need to check both the id and question. */ query = NULL; list_head = &(channel->queries_by_qid[id % ARES_QID_TABLE_SIZE]); @@ -574,11 +565,34 @@ static void process_answer(ares_channel channel, unsigned char *abuf, if (!query) return; + packetsz = PACKETSZ; + /* If we use EDNS and server answers with one of these RCODES, the protocol + * extension is not understood by the responder. We must retry the query + * without EDNS enabled. + */ + if (channel->flags & ARES_FLAG_EDNS) + { + packetsz = channel->ednspsz; + if (rcode == NOTIMP || rcode == FORMERR || rcode == SERVFAIL) + { + int qlen = alen - EDNSFIXEDSZ; + channel->flags ^= ARES_FLAG_EDNS; + query->tcplen -= EDNSFIXEDSZ; + query->qlen -= EDNSFIXEDSZ; + query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff); + query->tcpbuf[1] = (unsigned char)(qlen & 0xff); + DNS_HEADER_SET_ARCOUNT(query->tcpbuf + 2, 0); + query->tcpbuf = realloc(query->tcpbuf, query->tcplen); + ares__send_query(channel, query, now); + return; + } + } + /* If we got a truncated UDP packet and are not ignoring truncation, * don't accept the packet, and switch the query to TCP if we hadn't * done so already. */ - if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC)) + if ((tc || alen > packetsz) && !tcp && !(channel->flags & ARES_FLAG_IGNTC)) { if (!query->using_tcp) { @@ -591,8 +605,8 @@ static void process_answer(ares_channel channel, unsigned char *abuf, /* Limit alen to PACKETSZ if we aren't using TCP (only relevant if we * are ignoring truncation. */ - if (alen > PACKETSZ && !tcp) - alen = PACKETSZ; + if (alen > packetsz && !tcp) + alen = packetsz; /* If we aren't passing through all error packets, discard packets * with SERVFAIL, NOTIMP, or REFUSED response codes. @@ -626,6 +640,31 @@ static void process_broken_connections(ares_channel channel, } } +/* Swap the contents of two lists */ +static void swap_lists(struct list_node* head_a, + struct list_node* head_b) +{ + int is_a_empty = ares__is_list_empty(head_a); + int is_b_empty = ares__is_list_empty(head_b); + struct list_node old_a = *head_a; + struct list_node old_b = *head_b; + + if (is_a_empty) { + ares__init_list_head(head_b); + } else { + *head_b = old_a; + old_a.next->prev = head_b; + old_a.prev->next = head_b; + } + if (is_b_empty) { + ares__init_list_head(head_a); + } else { + *head_a = old_b; + old_b.next->prev = head_a; + old_b.prev->next = head_a; + } +} + static void handle_error(ares_channel channel, int whichserver, struct timeval *now) { @@ -639,15 +678,14 @@ static void handle_error(ares_channel channel, int whichserver, /* Reset communications with this server. */ ares__close_sockets(channel, server); - /* Tell all queries talking to this server to move on and not try - * this server again. We steal the current list of queries that were - * in-flight to this server, since when we call next_server this can - * cause the queries to be re-sent to this server, which will - * re-insert these queries in that same server->queries_to_server - * list. + /* Tell all queries talking to this server to move on and not try this + * server again. We steal the current list of queries that were in-flight to + * this server, since when we call next_server this can cause the queries to + * be re-sent to this server, which will re-insert these queries in that + * same server->queries_to_server list. */ ares__init_list_head(&list_head); - ares__swap_lists(&list_head, &(server->queries_to_server)); + swap_lists(&list_head, &(server->queries_to_server)); for (list_node = list_head.next; list_node != &list_head; ) { query = list_node->data; @@ -663,14 +701,15 @@ static void handle_error(ares_channel channel, int whichserver, } static void skip_server(ares_channel channel, struct query *query, - int whichserver) { - /* The given server gave us problems with this query, so if we have - * the luxury of using other servers, then let's skip the - * potentially broken server and just use the others. If we only - * have one server and we need to retry then we should just go ahead - * and re-use that server, since it's our only hope; perhaps we - * just got unlucky, and retrying will work (eg, the server timed - * out our TCP connection just as we were sending another request). + int whichserver) +{ + /* The given server gave us problems with this query, so if we have the + * luxury of using other servers, then let's skip the potentially broken + * server and just use the others. If we only have one server and we need to + * retry then we should just go ahead and re-use that server, since it's our + * only hope; perhaps we just got unlucky, and retrying will work (eg, the + * server timed out our TCP connection just as we were sending another + * request). */ if (channel->nservers > 1) { @@ -693,11 +732,10 @@ static void next_server(ares_channel channel, struct query *query, query->server = (query->server + 1) % channel->nservers; server = &channel->servers[query->server]; - /* We don't want to use this server if (1) we decided this - * connection is broken, and thus about to be closed, (2) - * we've decided to skip this server because of earlier - * errors we encountered, or (3) we already sent this query - * over this exact connection. + /* We don't want to use this server if (1) we decided this connection is + * broken, and thus about to be closed, (2) we've decided to skip this + * server because of earlier errors we encountered, or (3) we already + * sent this query over this exact connection. */ if (!server->is_broken && !query->server_info[query->server].skip_server && @@ -709,11 +747,11 @@ static void next_server(ares_channel channel, struct query *query, return; } - /* You might think that with TCP we only need one try. However, - * even when using TCP, servers can time-out our connection just - * as we're sending a request, or close our connection because - * they die, or never send us a reply because they get wedged or - * tickle a bug that drops our request. + /* You might think that with TCP we only need one try. However, even + * when using TCP, servers can time-out our connection just as we're + * sending a request, or close our connection because they die, or never + * send us a reply because they get wedged or tickle a bug that drops + * our request. */ } @@ -749,11 +787,11 @@ void ares__send_query(ares_channel channel, struct query *query, end_query(channel, query, ARES_ENOMEM, NULL, 0); return; } - /* To make the common case fast, we avoid copies by using the - * query's tcpbuf for as long as the query is alive. In the rare - * case where the query ends while it's queued for transmission, - * then we give the sendreq its own copy of the request packet - * and put it in sendreq->data_storage. + /* To make the common case fast, we avoid copies by using the query's + * tcpbuf for as long as the query is alive. In the rare case where the + * query ends while it's queued for transmission, then we give the + * sendreq its own copy of the request packet and put it in + * sendreq->data_storage. */ sendreq->data_storage = NULL; sendreq->data = query->tcpbuf; @@ -916,10 +954,12 @@ static int configure_socket(ares_socket_t s, int family, ares_channel channel) } } else if (family == AF_INET6) { - if (memcmp(channel->local_ip6, &ares_in6addr_any, sizeof(channel->local_ip6)) != 0) { + if (memcmp(channel->local_ip6, &ares_in6addr_any, + sizeof(channel->local_ip6)) != 0) { memset(&local.sa6, 0, sizeof(local.sa6)); local.sa6.sin6_family = AF_INET6; - memcpy(&local.sa6.sin6_addr, channel->local_ip6, sizeof(channel->local_ip6)); + memcpy(&local.sa6.sin6_addr, channel->local_ip6, + sizeof(channel->local_ip6)); if (bind(s, &local.sa, sizeof(local.sa6)) < 0) return -1; } @@ -1222,19 +1262,17 @@ static void end_query (ares_channel channel, struct query *query, int status, assert(sendreq->data_storage == NULL); if (status == ARES_SUCCESS) { - /* We got a reply for this query, but this queued - * sendreq points into this soon-to-be-gone query's - * tcpbuf. Probably this means we timed out and queued - * the query for retransmission, then received a - * response before actually retransmitting. This is - * perfectly fine, so we want to keep the connection - * running smoothly if we can. But in the worst case - * we may have sent only some prefix of the query, - * with some suffix of the query left to send. Also, - * the buffer may be queued on multiple queues. To - * prevent dangling pointers to the query's tcpbuf and - * handle these cases, we just give such sendreqs - * their own copy of the query packet. + /* We got a reply for this query, but this queued sendreq + * points into this soon-to-be-gone query's tcpbuf. Probably + * this means we timed out and queued the query for + * retransmission, then received a response before actually + * retransmitting. This is perfectly fine, so we want to keep + * the connection running smoothly if we can. But in the worst + * case we may have sent only some prefix of the query, with + * some suffix of the query left to send. Also, the buffer may + * be queued on multiple queues. To prevent dangling pointers + * to the query's tcpbuf and handle these cases, we just give + * such sendreqs their own copy of the query packet. */ sendreq->data_storage = malloc(sendreq->len); if (sendreq->data_storage != NULL) @@ -1245,14 +1283,12 @@ static void end_query (ares_channel channel, struct query *query, int status, } if ((status != ARES_SUCCESS) || (sendreq->data_storage == NULL)) { - /* We encountered an error (probably a timeout, - * suggesting the DNS server we're talking to is - * probably unreachable, wedged, or severely - * overloaded) or we couldn't copy the request, so - * mark the connection as broken. When we get to - * process_broken_connections() we'll close the - * connection and try to re-send requests to another - * server. + /* We encountered an error (probably a timeout, suggesting the + * DNS server we're talking to is probably unreachable, + * wedged, or severely overloaded) or we couldn't copy the + * request, so mark the connection as broken. When we get to + * process_broken_connections() we'll close the connection and + * try to re-send requests to another server. */ server->is_broken = 1; /* Just to be paranoid, zero out this sendreq... */ @@ -1266,8 +1302,8 @@ static void end_query (ares_channel channel, struct query *query, int status, query->callback(query->arg, status, query->timeouts, abuf, alen); ares__free_query(query); - /* Simple cleanup policy: if no queries are remaining, close all - * network sockets unless STAYOPEN is set. + /* Simple cleanup policy: if no queries are remaining, close all network + * sockets unless STAYOPEN is set. */ if (!(channel->flags & ARES_FLAG_STAYOPEN) && ares__is_list_empty(&(channel->all_queries))) diff --git a/deps/cares/src/ares_query.c b/deps/cares/src/ares_query.c index 63652e2..4bc9c25 100644 --- a/deps/cares/src/ares_query.c +++ b/deps/cares/src/ares_query.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -31,7 +28,6 @@ # include #endif -#include #include "ares.h" #include "ares_dns.h" #include "ares_private.h" @@ -43,7 +39,7 @@ struct qquery { static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); -void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len) +static void rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len) { unsigned char x; unsigned char y; @@ -105,6 +101,13 @@ static unsigned short generate_unique_id(ares_channel channel) return (unsigned short)id; } +unsigned short ares__generate_new_id(rc4_key* key) +{ + unsigned short r=0; + rc4(key, (unsigned char *)&r, sizeof(r)); + return r; +} + void ares_query(ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg) { @@ -114,8 +117,8 @@ void ares_query(ares_channel channel, const char *name, int dnsclass, /* Compose the query. */ rd = !(channel->flags & ARES_FLAG_NORECURSE); - status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf, - &qlen); + status = ares_create_query(name, dnsclass, type, channel->next_id, rd, &qbuf, + &qlen, (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0); if (status != ARES_SUCCESS) { if (qbuf != NULL) free(qbuf); diff --git a/deps/cares/src/ares_search.c b/deps/cares/src/ares_search.c index 1877c19..ec07640 100644 --- a/deps/cares/src/ares_search.c +++ b/deps/cares/src/ares_search.c @@ -16,11 +16,6 @@ #include "ares_setup.h" -#include -#include -#include -#include - #ifdef HAVE_STRINGS_H # include #endif diff --git a/deps/cares/src/ares_send.c b/deps/cares/src/ares_send.c index 75a84f6..1a450b1 100644 --- a/deps/cares/src/ares_send.c +++ b/deps/cares/src/ares_send.c @@ -16,9 +16,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -31,9 +28,6 @@ # include #endif -#include -#include -#include #include "ares.h" #include "ares_dns.h" #include "ares_private.h" @@ -42,7 +36,7 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, ares_callback callback, void *arg) { struct query *query; - int i; + int i, packetsz; struct timeval now; /* Verify that the query is at least long enough to hold the header. */ @@ -109,7 +103,10 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, query->server_info[i].skip_server = 0; query->server_info[i].tcp_connection_generation = 0; } - query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > PACKETSZ; + + packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ; + query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz; + query->error_status = ARES_ECONNREFUSED; query->timeouts = 0; diff --git a/deps/cares/src/ares_timeout.c b/deps/cares/src/ares_timeout.c index 738ad15..0b5a435 100644 --- a/deps/cares/src/ares_timeout.c +++ b/deps/cares/src/ares_timeout.c @@ -16,12 +16,10 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_TIME_H -#include +#ifdef HAVE_LIMITS_H +#include #endif -#include - #include "ares.h" #include "ares_private.h" @@ -67,8 +65,10 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, */ if (min_offset != -1) { - nextstop.tv_sec = min_offset/1000; - nextstop.tv_usec = (min_offset%1000)*1000; + int ioffset = (min_offset > (long)INT_MAX) ? INT_MAX : (int)min_offset; + + nextstop.tv_sec = ioffset/1000; + nextstop.tv_usec = (ioffset%1000)*1000; if (!maxtv || ares__timedout(maxtv, &nextstop)) { diff --git a/deps/cares/src/bitncmp.c b/deps/cares/src/bitncmp.c index 5c89506..faedff9 100644 --- a/deps/cares/src/bitncmp.c +++ b/deps/cares/src/bitncmp.c @@ -33,27 +33,27 @@ * author: * Paul Vixie (ISC), June 1996 */ -int -ares_bitncmp(const void *l, const void *r, int n) { - unsigned int lb, rb; - int x, b; +int ares__bitncmp(const void *l, const void *r, int n) +{ + unsigned int lb, rb; + int x, b; - b = n / 8; - x = memcmp(l, r, b); - if (x || (n % 8) == 0) - return (x); + b = n / 8; + x = memcmp(l, r, b); + if (x || (n % 8) == 0) + return (x); - lb = ((const unsigned char *)l)[b]; - rb = ((const unsigned char *)r)[b]; - for (b = n % 8; b > 0; b--) { - if ((lb & 0x80) != (rb & 0x80)) { - if (lb & 0x80) - return (1); - return (-1); - } - lb <<= 1; - rb <<= 1; - } - return (0); + lb = ((const unsigned char *)l)[b]; + rb = ((const unsigned char *)r)[b]; + for (b = n % 8; b > 0; b--) { + if ((lb & 0x80) != (rb & 0x80)) { + if (lb & 0x80) + return (1); + return (-1); + } + lb <<= 1; + rb <<= 1; + } + return (0); } #endif diff --git a/deps/cares/src/bitncmp.h b/deps/cares/src/bitncmp.h index b0a5c81..7b8d66c 100644 --- a/deps/cares/src/bitncmp.h +++ b/deps/cares/src/bitncmp.h @@ -2,7 +2,7 @@ #define __ARES_BITNCMP_H -/* Copyright (C) 2005 by Dominick Meglio +/* Copyright (C) 2005, 2013 by Dominick Meglio * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -18,9 +18,9 @@ */ #ifndef HAVE_BITNCMP -int ares_bitncmp(const void *l, const void *r, int n); +int ares__bitncmp(const void *l, const void *r, int n); #else -#define ares_bitncmp(x,y,z) bitncmp(x,y,z) +#define ares__bitncmp(x,y,z) bitncmp(x,y,z) #endif #endif /* __ARES_BITNCMP_H */ diff --git a/deps/cares/src/get_ver.awk b/deps/cares/src/get_ver.awk deleted file mode 100644 index a63c729..0000000 --- a/deps/cares/src/get_ver.awk +++ /dev/null @@ -1,35 +0,0 @@ -# *************************************************************************** -# * Project: c-ares -# * -# *************************************************************************** -# awk script which fetches c-ares version number and string from input -# file and writes them to STDOUT. Here you can get an awk version for Win32: -# http://www.gknw.net/development/prgtools/awk-20070501.zip -# -BEGIN { - if (match (ARGV[1], /ares_version.h/)) { - while ((getline < ARGV[1]) > 0) { - if (match ($0, /^#define ARES_COPYRIGHT "[^"]+"$/)) { - libcares_copyright_str = substr($0, 25, length($0)-25); - } - else if (match ($0, /^#define ARES_VERSION_STR "[^"]+"$/)) { - libcares_ver_str = substr($3, 2, length($3)-2); - } - else if (match ($0, /^#define ARES_VERSION_MAJOR [0-9]+$/)) { - libcares_ver_major = substr($3, 1, length($3)); - } - else if (match ($0, /^#define ARES_VERSION_MINOR [0-9]+$/)) { - libcares_ver_minor = substr($3, 1, length($3)); - } - else if (match ($0, /^#define ARES_VERSION_PATCH [0-9]+$/)) { - libcares_ver_patch = substr($3, 1, length($3)); - } - } - libcares_ver = libcares_ver_major "," libcares_ver_minor "," libcares_ver_patch; - print "LIBCARES_VERSION = " libcares_ver ""; - print "LIBCARES_VERSION_STR = " libcares_ver_str ""; - print "LIBCARES_COPYRIGHT_STR = " libcares_copyright_str ""; - } -} - - diff --git a/deps/cares/src/inet_net_pton.c b/deps/cares/src/inet_net_pton.c index 45bb5d4..71c07c5 100644 --- a/deps/cares/src/inet_net_pton.c +++ b/deps/cares/src/inet_net_pton.c @@ -18,9 +18,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -36,15 +33,10 @@ # include #endif -#include -#include -#include -#include - #include "ares.h" #include "ares_ipv6.h" #include "ares_nowarn.h" -#include "inet_net_pton.h" +#include "ares_inet_net_pton.h" const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }; @@ -448,4 +440,11 @@ int ares_inet_pton(int af, const char *src, void *dst) return 0; return (result > -1 ? 1 : -1); } +#else /* HAVE_INET_PTON */ +int ares_inet_pton(int af, const char *src, void *dst) +{ + /* just relay this to the underlying function */ + return inet_pton(af, src, dst); +} + #endif diff --git a/deps/cares/src/inet_ntop.c b/deps/cares/src/inet_ntop.c index 57e1146..9420f6c 100644 --- a/deps/cares/src/inet_ntop.c +++ b/deps/cares/src/inet_ntop.c @@ -17,9 +17,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -35,15 +32,8 @@ # include #endif -#include -#include -#include -#include - #include "ares.h" #include "ares_ipv6.h" -#include "inet_ntop.h" - #ifndef HAVE_INET_NTOP @@ -69,13 +59,13 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); * Paul Vixie, 1996. */ const char * -ares_inet_ntop(int af, const void *src, char *dst, size_t size) +ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size) { switch (af) { case AF_INET: - return (inet_ntop4(src, dst, size)); + return (inet_ntop4(src, dst, (size_t)size)); case AF_INET6: - return (inet_ntop6(src, dst, size)); + return (inet_ntop6(src, dst, (size_t)size)); default: SET_ERRNO(EAFNOSUPPORT); return (NULL); @@ -205,4 +195,14 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) strcpy(dst, tmp); return (dst); } -#endif + +#else /* HAVE_INET_NTOP */ + +const char * +ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size) +{ + /* just relay this to the underlying function */ + return inet_ntop(af, src, dst, size); +} + +#endif /* HAVE_INET_NTOP */ diff --git a/deps/cares/src/inet_ntop.h b/deps/cares/src/inet_ntop.h deleted file mode 100644 index c583488..0000000 --- a/deps/cares/src/inet_ntop.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef __ARES_INET_NTOP_H -#define __ARES_INET_NTOP_H - - -/* Copyright (C) 2005 by Dominick Meglio - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifdef HAVE_INET_NTOP -#define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) -#else -const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); -#endif - -#endif /* __ARES_INET_NTOP_H */ diff --git a/deps/cares/src/setup_once.h b/deps/cares/src/setup_once.h index fc630ef..25b144a 100644 --- a/deps/cares/src/setup_once.h +++ b/deps/cares/src/setup_once.h @@ -2,7 +2,7 @@ #define __SETUP_ONCE_H -/* Copyright (C) 2004 - 2012 by Daniel Stenberg et al +/* Copyright (C) 2004 - 2013 by Daniel Stenberg et al * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided @@ -76,6 +76,34 @@ #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef __hpux +# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) +# ifdef _APP32_64BIT_OFF_T +# define OLD_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T +# undef _APP32_64BIT_OFF_T +# else +# undef OLD_APP32_64BIT_OFF_T +# endif +# endif +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifdef __hpux +# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) +# ifdef OLD_APP32_64BIT_OFF_T +# define _APP32_64BIT_OFF_T OLD_APP32_64BIT_OFF_T +# undef OLD_APP32_64BIT_OFF_T +# endif +# endif +#endif + /* * Definition of timeval struct for platforms that don't have it. @@ -232,6 +260,8 @@ struct timeval { # define sclose(x) closesocket((x)) #elif defined(HAVE_CLOSESOCKET_CAMEL) # define sclose(x) CloseSocket((x)) +#elif defined(HAVE_CLOSE_S) +# define sclose(x) close_s((x)) #else # define sclose(x) close((x)) #endif @@ -260,6 +290,18 @@ struct timeval { /* + * 'bool' stuff compatible with HP-UX headers. + */ + +#if defined(__hpux) && !defined(HAVE_BOOL_T) + typedef int bool; +# define false 0 +# define true 1 +# define HAVE_BOOL_T +#endif + + +/* * 'bool' exists on platforms with , i.e. C99 platforms. * On non-C99 platforms there's no bool, so define an enum for that. * On C99 platforms 'false' and 'true' also exist. Enum uses a -- 2.7.4