diff options
author | Charles Longeau <github@chl.be> | 2013-04-03 13:01:23 +0200 |
---|---|---|
committer | Charles Longeau <github@chl.be> | 2013-04-03 13:01:23 +0200 |
commit | 92ecda846a41f85e6cfcda7eafa127fa7e5d56e8 (patch) | |
tree | dc7a2387fd331fdfea9d8296df58f504ea60b4c2 /contrib | |
parent | Merge branch 'master' into portable (diff) | |
download | OpenSMTPD-92ecda846a41f85e6cfcda7eafa127fa7e5d56e8.tar.xz OpenSMTPD-92ecda846a41f85e6cfcda7eafa127fa7e5d56e8.zip |
sync with latest asr changes
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/lib/libc/asr/CVS/Entries | 44 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr.c | 65 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr.h | 6 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr_debug.c | 20 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr_private.h | 15 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr_utils.c | 26 | ||||
-rw-r--r-- | contrib/lib/libc/asr/async_resolver.3 | 26 | ||||
-rw-r--r-- | contrib/lib/libc/asr/getaddrinfo_async.c | 6 | ||||
-rw-r--r-- | contrib/lib/libc/asr/gethostnamadr.c | 10 | ||||
-rw-r--r-- | contrib/lib/libc/asr/gethostnamadr_async.c | 4 | ||||
-rw-r--r-- | contrib/lib/libc/asr/getnetnamadr.c | 4 | ||||
-rw-r--r-- | contrib/lib/libc/asr/getnetnamadr_async.c | 8 | ||||
-rw-r--r-- | contrib/lib/libc/asr/res_mkquery.c | 16 | ||||
-rw-r--r-- | contrib/lib/libc/asr/res_search_async.c | 8 | ||||
-rw-r--r-- | contrib/lib/libc/asr/res_send_async.c | 64 |
15 files changed, 170 insertions, 152 deletions
diff --git a/contrib/lib/libc/asr/CVS/Entries b/contrib/lib/libc/asr/CVS/Entries index 1c270c56..b33b53e2 100644 --- a/contrib/lib/libc/asr/CVS/Entries +++ b/contrib/lib/libc/asr/CVS/Entries @@ -1,26 +1,26 @@ /Makefile.inc/1.5/Sat Nov 24 17:15:45 2012// -/asr.h/1.4/Result of merge// -/asr_debug.c/1.10/Result of merge+Sat Nov 24 17:15:46 2012// /getrrsetbyname_async.c/1.3/Result of merge+Sat Nov 24 17:15:50 2012// -/getnetnamadr_async.c/1.7/Result of merge// -/res_search_async.c/1.4/Result of merge// -/asr_utils.c/1.4/Result of merge// -/getaddrinfo.c/1.1/Sat Mar 30 02:18:10 2013// -/getnameinfo.c/1.1/Sat Mar 30 02:18:10 2013// /getnameinfo_async.c/1.6/Result of merge// -/getnetnamadr.c/1.2/Sat Mar 30 02:18:10 2013// -/getrrsetbyname.c/1.1/Sat Mar 30 02:18:10 2013// -/res_debug.c/1.1/Sat Mar 30 02:18:10 2013// -/res_init.c/1.1/Sat Mar 30 02:18:10 2013// -/res_mkquery.c/1.4/Sat Mar 30 02:24:27 2013// -/res_query.c/1.1/Sat Mar 30 02:18:10 2013// -/res_send.c/1.1/Sat Mar 30 02:18:10 2013// -/sethostent.c/1.1/Sat Mar 30 02:18:10 2013// -/asr.c/1.18/Result of merge// -/asr_private.h/1.13/Result of merge// -/async_resolver.3/1.9/Mon Apr 1 12:13:23 2013// -/getaddrinfo_async.c/1.13/Result of merge// -/gethostnamadr.c/1.3/Mon Apr 1 12:13:23 2013// -/gethostnamadr_async.c/1.15/Result of merge// -/res_send_async.c/1.9/Result of merge// +/asr.c/1.21/Result of merge// +/asr.h/1.5/Result of merge// +/asr_debug.c/1.11/Result of merge// +/asr_private.h/1.16/Wed Apr 3 10:45:18 2013// +/asr_utils.c/1.6/Result of merge// +/async_resolver.3/1.10/Wed Apr 3 10:45:18 2013// +/getaddrinfo.c/1.1/Wed Apr 3 10:44:53 2013// +/getaddrinfo_async.c/1.14/Result of merge+Wed Apr 3 10:45:18 2013// +/gethostnamadr.c/1.4/Wed Apr 3 10:45:19 2013// +/gethostnamadr_async.c/1.16/Result of merge// +/getnameinfo.c/1.1/Wed Apr 3 10:44:53 2013// +/getnetnamadr.c/1.3/Wed Apr 3 10:45:19 2013// +/getnetnamadr_async.c/1.8/Result of merge// +/getrrsetbyname.c/1.1/Wed Apr 3 10:44:53 2013// +/res_debug.c/1.1/Wed Apr 3 10:44:53 2013// +/res_init.c/1.1/Wed Apr 3 10:44:53 2013// +/res_mkquery.c/1.5/Wed Apr 3 10:45:19 2013// +/res_query.c/1.1/Wed Apr 3 10:44:53 2013// +/res_search_async.c/1.6/Result of merge// +/res_send.c/1.1/Wed Apr 3 10:44:53 2013// +/res_send_async.c/1.13/Result of merge+Wed Apr 3 10:45:19 2013// +/sethostent.c/1.1/Wed Apr 3 10:44:53 2013// D diff --git a/contrib/lib/libc/asr/asr.c b/contrib/lib/libc/asr/asr.c index 47137ba1..254e80a0 100644 --- a/contrib/lib/libc/asr/asr.c +++ b/contrib/lib/libc/asr/asr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr.c,v 1.18 2013/03/31 19:42:10 eric Exp $ */ +/* $OpenBSD: asr.c,v 1.21 2013/04/01 20:41:12 eric Exp $ */ /* * Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org> * @@ -449,7 +449,7 @@ asr_check_reload(struct asr *asr) asr->a_ctx = ac; } -/* +/* * Construct a fully-qualified domain name for the given name and domain. * If "name" ends with a '.' it is considered as a FQDN by itself. * Otherwise, the domain, which must be a FQDN, is appended to "name" (it @@ -471,15 +471,18 @@ asr_make_fqdn(const char *name, const char *domain, char *buf, size_t buflen) len = strlen(name); if (len == 0) { - strlcpy(buf, domain, buflen); + if (strlcpy(buf, domain, buflen) >= buflen) + return (0); } else if (name[len - 1] != '.') { if (domain[0] == '.') domain += 1; - strlcpy(buf, name, buflen); - strlcat(buf, ".", buflen); - strlcat(buf, domain, buflen); + if (strlcpy(buf, name, buflen) >= buflen || + strlcat(buf, ".", buflen) >= buflen || + strlcat(buf, domain, buflen) >= buflen) + return (0); } else { - strlcpy(buf, name, buflen); + if (strlcpy(buf, name, buflen) >= buflen) + return (0); } return (strlen(buf)); @@ -487,6 +490,7 @@ asr_make_fqdn(const char *name, const char *domain, char *buf, size_t buflen) /* * Concatenate a name and a domain name. The result has no trailing dot. + * Return the resulting string length, or 0 in case of error. */ size_t asr_domcat(const char *name, const char *domain, char *buf, size_t buflen) @@ -516,7 +520,7 @@ asr_ndots(const char *s) return (n); } -/* +/* * Allocate a new empty context. */ static struct asr_ctx * @@ -596,7 +600,7 @@ pass0(char **tok, int n, struct asr_ctx *ac) return; if (n != 2) return; - if (asr_parse_nameserver((struct sockaddr*)&ss, tok[1])) + if (asr_parse_nameserver((struct sockaddr *)&ss, tok[1])) return; if ((ac->ac_ns[ac->ac_nscount] = calloc(1, SS_LEN(&ss))) == NULL) return; @@ -611,28 +615,19 @@ pass0(char **tok, int n, struct asr_ctx *ac) ac->ac_domain = strdup(tok[1]); } else if (!strcmp(tok[0], "lookup")) { - /* ignore the line if we already set lookup */ - if (ac->ac_dbcount != 0) - return; - if (n - 1 > ASR_MAXDB) - return; /* ensure that each lookup is only given once */ for (i = 1; i < n; i++) for (j = i + 1; j < n; j++) if (!strcmp(tok[i], tok[j])) return; - for (i = 1; i < n; i++, ac->ac_dbcount++) { - if (!strcmp(tok[i], "yp")) { - ac->ac_db[i-1] = ASR_DB_YP; - } else if (!strcmp(tok[i], "bind")) { - ac->ac_db[i-1] = ASR_DB_DNS; - } else if (!strcmp(tok[i], "file")) { - ac->ac_db[i-1] = ASR_DB_FILE; - } else { - /* ignore the line */ - ac->ac_dbcount = 0; - return; - } + ac->ac_dbcount = 0; + for (i = 1; i < n && ac->ac_dbcount < ASR_MAXDB; i++) { + if (!strcmp(tok[i], "yp")) + ac->ac_db[ac->ac_dbcount++] = ASR_DB_YP; + else if (!strcmp(tok[i], "bind")) + ac->ac_db[ac->ac_dbcount++] = ASR_DB_DNS; + else if (!strcmp(tok[i], "file")) + ac->ac_db[ac->ac_dbcount++] = ASR_DB_FILE; } } else if (!strcmp(tok[0], "search")) { /* resolv.conf says the last line wins */ @@ -805,7 +800,7 @@ asr_ctx_envopts(struct asr_ctx *ac) /* * Parse a resolv.conf(5) nameserver string into a sockaddr. - */ + */ static int asr_parse_nameserver(struct sockaddr *sa, const char *s) { @@ -848,7 +843,7 @@ asr_parse_nameserver(struct sockaddr *sa, const char *s) * where labels are separated by dots. The result is put into the "buf" buffer, * truncated if it exceeds "max" chars. The function returns "buf". */ -char* +char * asr_strdname(const char *_dname, char *buf, size_t max) { const unsigned char *dname = _dname; @@ -969,8 +964,8 @@ enum { * multiple times (with the same name) to generate the next possible domain * name, if any. * - * It returns 0 if it could generate a new domain name, or -1 when all - * possibilites have been exhausted. + * It returns -1 if all possibilities have been exhausted, 0 if there was an + * error generating the next name, or the resulting name length. */ int asr_iter_domain(struct async *as, const char *name, char * buf, size_t len) @@ -1024,8 +1019,9 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len) if ((asr_ndots(name)) >= as->as_ctx->ac_ndots) { DPRINT("asr: asr_iter_domain(\"%s\") ndots\n", name); as->as_dom_flags |= ASYNC_DOM_NDOTS; - strlcpy(buf, name, len); - return (0); + if (strlcpy(buf, name, len) >= len) + return (0); + return (strlen(buf)); } /* Otherwise, starts using the search domains */ /* FALLTHROUGH */ @@ -1050,8 +1046,9 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len) if (!(as->as_dom_flags & ASYNC_DOM_NDOTS)) { DPRINT("asr: asr_iter_domain(\"%s\") as is\n", name); as->as_dom_flags |= ASYNC_DOM_ASIS; - strlcpy(buf, name, len); - return (0); + if (strlcpy(buf, name, len) >= len) + return (0); + return (strlen(buf)); } /* Otherwise, we are done. */ diff --git a/contrib/lib/libc/asr/asr.h b/contrib/lib/libc/asr/asr.h index 199ab9f7..4ccf563c 100644 --- a/contrib/lib/libc/asr/asr.h +++ b/contrib/lib/libc/asr/asr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: asr.h,v 1.4 2012/11/24 15:12:48 eric Exp $ */ +/* $OpenBSD: asr.h,v 1.5 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -75,8 +75,8 @@ void async_abort(struct async *); /* This opaque structure holds an async resolver context. */ struct asr; -struct asr *async_resolver(const char*); -void async_resolver_done(struct asr*); +struct asr *async_resolver(const char *); +void async_resolver_done(struct asr *); /* Async version of the resolver API */ diff --git a/contrib/lib/libc/asr/asr_debug.c b/contrib/lib/libc/asr/asr_debug.c index 2ed7b343..fc52eccd 100644 --- a/contrib/lib/libc/asr/asr_debug.c +++ b/contrib/lib/libc/asr/asr_debug.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr_debug.c,v 1.10 2012/11/24 15:12:48 eric Exp $ */ +/* $OpenBSD: asr_debug.c,v 1.11 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -28,11 +28,11 @@ #include "asr.h" #include "asr_private.h" -static const char* rcodetostr(uint16_t); -static const char* print_dname(const char *, char *, size_t); -static const char* print_header(const struct header *, char *, size_t); -static const char* print_query(const struct query *, char *, size_t); -static const char* print_rr(const struct rr*, char *, size_t); +static const char *rcodetostr(uint16_t); +static const char *print_dname(const char *, char *, size_t); +static const char *print_header(const struct header *, char *, size_t); +static const char *print_query(const struct query *, char *, size_t); +static const char *print_rr(const struct rr *, char *, size_t); FILE *asr_debug = NULL; @@ -53,13 +53,13 @@ rcodetostr(uint16_t v) } } -static const char* +static const char * print_dname(const char *_dname, char *buf, size_t max) { return (asr_strdname(_dname, buf, max)); } -static const char* +static const char * print_rr(const struct rr *rr, char *buf, size_t max) { char *res; @@ -131,7 +131,7 @@ print_rr(const struct rr *rr, char *buf, size_t max) return (res); } -static const char* +static const char * print_query(const struct query *q, char *buf, size_t max) { char b[256]; @@ -143,7 +143,7 @@ print_query(const struct query *q, char *buf, size_t max) return (buf); } -static const char* +static const char * print_header(const struct header *h, char *buf, size_t max) { snprintf(buf, max, diff --git a/contrib/lib/libc/asr/asr_private.h b/contrib/lib/libc/asr/asr_private.h index 6690f1dd..f5f524c7 100644 --- a/contrib/lib/libc/asr/asr_private.h +++ b/contrib/lib/libc/asr/asr_private.h @@ -1,4 +1,4 @@ -/* $OpenBSD: asr_private.h,v 1.13 2013/04/01 08:54:06 eric Exp $ */ +/* $OpenBSD: asr_private.h,v 1.16 2013/04/02 16:38:37 eric Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -207,6 +207,7 @@ struct async { size_t ibuflen; size_t ibufsize; size_t datalen; /* for tcp io */ + uint16_t pktlen; } dns; struct { @@ -305,15 +306,15 @@ enum asr_state { /* asr_utils.c */ void pack_init(struct pack *, char *, size_t); -int pack_header(struct pack*, const struct header*); -int pack_query(struct pack*, uint16_t, uint16_t, const char*); +int pack_header(struct pack *, const struct header *); +int pack_query(struct pack *, uint16_t, uint16_t, const char *); void unpack_init(struct unpack *, const char *, size_t); -int unpack_header(struct unpack*, struct header*); -int unpack_query(struct unpack*, struct query*); -int unpack_rr(struct unpack*, struct rr*); +int unpack_header(struct unpack *, struct header *); +int unpack_query(struct unpack *, struct query *); +int unpack_rr(struct unpack *, struct rr *); int sockaddr_from_str(struct sockaddr *, int, const char *); -ssize_t dname_from_fqdn(const char*, char*, size_t); +ssize_t dname_from_fqdn(const char *, char *, size_t); /* asr.c */ struct asr_ctx *asr_use_resolver(struct asr *); diff --git a/contrib/lib/libc/asr/asr_utils.c b/contrib/lib/libc/asr/asr_utils.c index 6f708fd8..892c6e40 100644 --- a/contrib/lib/libc/asr/asr_utils.c +++ b/contrib/lib/libc/asr/asr_utils.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr_utils.c,v 1.4 2013/03/29 23:01:24 eric Exp $ */ +/* $OpenBSD: asr_utils.c,v 1.6 2013/04/02 21:23:17 eric Exp $ */ /* * Copyright (c) 2009-2012 Eric Faurot <eric@faurot.net> * @@ -35,20 +35,20 @@ #include "asr.h" #include "asr_private.h" -static int dname_check_label(const char*, size_t); -static ssize_t dname_expand(const unsigned char*, size_t, size_t, size_t*, +static int dname_check_label(const char *, size_t); +static ssize_t dname_expand(const unsigned char *, size_t, size_t, size_t *, char *, size_t); -static int unpack_data(struct unpack*, void*, size_t); -static int unpack_u16(struct unpack*, uint16_t*); -static int unpack_u32(struct unpack*, uint32_t*); -static int unpack_inaddr(struct unpack*, struct in_addr*); -static int unpack_in6addr(struct unpack*, struct in6_addr*); -static int unpack_dname(struct unpack*, char*, size_t); +static int unpack_data(struct unpack *, void *, size_t); +static int unpack_u16(struct unpack *, uint16_t *); +static int unpack_u32(struct unpack *, uint32_t *); +static int unpack_inaddr(struct unpack *, struct in_addr *); +static int unpack_in6addr(struct unpack *, struct in6_addr *); +static int unpack_dname(struct unpack *, char *, size_t); -static int pack_data(struct pack*, const void*, size_t); -static int pack_u16(struct pack*, uint16_t); -static int pack_dname(struct pack*, const char*); +static int pack_data(struct pack *, const void *, size_t); +static int pack_u16(struct pack *, uint16_t); +static int pack_dname(struct pack *, const char *); static int dname_check_label(const char *s, size_t l) @@ -135,7 +135,7 @@ dname_expand(const unsigned char *data, size_t len, size_t offset, return (-1); if (end < offset + 2) end = offset + 2; - offset = ptr; + offset = start = ptr; continue; } if (offset + n + 1 > len) diff --git a/contrib/lib/libc/asr/async_resolver.3 b/contrib/lib/libc/asr/async_resolver.3 index b750e382..38f71f4c 100644 --- a/contrib/lib/libc/asr/async_resolver.3 +++ b/contrib/lib/libc/asr/async_resolver.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: async_resolver.3,v 1.9 2013/03/30 20:00:08 eric Exp $ +.\" $OpenBSD: async_resolver.3,v 1.10 2013/04/01 15:49:54 deraadt Exp $ .\" .\" Copyright (c) 2012, Eric Faurot <eric@openbsd.org> .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: March 30 2013 $ +.Dd $Mdocdate: April 1 2013 $ .Dt ASYN_RESOLVER 3 .Os .Sh NAME @@ -38,7 +38,7 @@ .Nd asynchronous resolver functions .Sh SYNOPSIS .Fd #include <asr.h> -.Ft struct asr* +.Ft struct asr * .Fn async_resolver "const char *conf" .Ft void .Fn async_resolver_done "struct asr *asr" @@ -48,25 +48,25 @@ .Fn async_run_sync "struct async *as" "struct async_res *ar" .Ft void .Fn async_abort "struct async *as" -.Ft struct async* +.Ft struct async * .Fn res_send_async "const unsigned char *pkt" "int pktlen" "unsigned char *ans" "int anslen" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn res_query_async "const char *name" "int class" "int type" "unsigned char *ans" "int anslen" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn getrrsetbyname_async "const char *hostname" "unsigned int rdclass" "unsigned int rdtype" "unsigned int flags" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn gethostbyname_async "const char *name" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn gethostbyname2_async "const char *name" "int af" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn gethostbyaddr_async "const void *addr" "socklen_t len" "int af" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn getnetbyname_async "const char *name" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn getnetbyaddr_async "in_addr_t net" "int type" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn getaddrinfo_async "const char *hostname" "const char *servname" "const struct addrinfo *hints" "struct asr *asr" -.Ft struct async* +.Ft struct async * .Fn getnameinfo_async "const struct sockaddr *sa" "socklen_t salen" "char *host" "size_t hostlen" "char *serv" "size_t servlen" "int flags" "struct asr *asr" .Sh DESCRIPTION The diff --git a/contrib/lib/libc/asr/getaddrinfo_async.c b/contrib/lib/libc/asr/getaddrinfo_async.c index 3be3a81f..403059fc 100644 --- a/contrib/lib/libc/asr/getaddrinfo_async.c +++ b/contrib/lib/libc/asr/getaddrinfo_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getaddrinfo_async.c,v 1.13 2013/03/30 20:11:19 eric Exp $ */ +/* $OpenBSD: getaddrinfo_async.c,v 1.14 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -443,7 +443,7 @@ get_port(const char *servname, const char *proto, int numonly) struct servent_data sed; #endif int port, r; - const char* e; + const char *e; if (servname == NULL) return (0); @@ -537,7 +537,7 @@ addrinfo_add(struct async *as, const struct sockaddr *sa, const char *cname) ai->ai_socktype = matches[i].socktype; ai->ai_protocol = proto; ai->ai_addrlen = SA_LEN(sa); - ai->ai_addr = (void*)(ai + 1); + ai->ai_addr = (void *)(ai + 1); if (cname && as->as.ai.hints.ai_flags & (AI_CANONNAME | AI_FQDN)) { if ((ai->ai_canonname = strdup(cname)) == NULL) { diff --git a/contrib/lib/libc/asr/gethostnamadr.c b/contrib/lib/libc/asr/gethostnamadr.c index ae4beadb..1ed1dcf4 100644 --- a/contrib/lib/libc/asr/gethostnamadr.c +++ b/contrib/lib/libc/asr/gethostnamadr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gethostnamadr.c,v 1.3 2013/04/01 07:47:26 eric Exp $ */ +/* $OpenBSD: gethostnamadr.c,v 1.4 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -27,7 +27,7 @@ #include "asr.h" #define PALIGN(p, l) \ - ((char*)(p) + (((uintptr_t)(p) % (l)) ? \ + ((char *)(p) + (((uintptr_t)(p) % (l)) ? \ (l) - (uintptr_t)(p) % (l) : 0)) static struct hostent *_gethostbyname(const char *, int); @@ -52,9 +52,9 @@ _fillhostent(const struct hostent *h, struct hostent *r, char *buf, size_t len) r->h_addr_list = _empty; end = buf + len; - ptr = (char**)PALIGN(buf, sizeof(char*)); + ptr = (char **)PALIGN(buf, sizeof(char *)); - if ((char*)ptr >= end) + if ((char *)ptr >= end) return; for (naliases = 0; h->h_aliases[naliases]; naliases++) @@ -62,7 +62,7 @@ _fillhostent(const struct hostent *h, struct hostent *r, char *buf, size_t len) for (naddrs = 0; h->h_addr_list[naddrs]; naddrs++) ; - pos = (char*)(ptr + (naliases + 1) + (naddrs + 1)); + pos = (char *)(ptr + (naliases + 1) + (naddrs + 1)); if (pos >= end) return; diff --git a/contrib/lib/libc/asr/gethostnamadr_async.c b/contrib/lib/libc/asr/gethostnamadr_async.c index 11789637..4c709bda 100644 --- a/contrib/lib/libc/asr/gethostnamadr_async.c +++ b/contrib/lib/libc/asr/gethostnamadr_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gethostnamadr_async.c,v 1.15 2013/04/01 08:54:07 eric Exp $ */ +/* $OpenBSD: gethostnamadr_async.c,v 1.16 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -540,7 +540,7 @@ hostent_alloc(int family) h->h.h_length = (family == AF_INET) ? 4 : 16; h->h.h_aliases = h->aliases; h->h.h_addr_list = h->addrs; - h->pos = (char*)(h) + sizeof(*h); + h->pos = (char *)(h) + sizeof(*h); h->end = h->pos + 1024; return (h); diff --git a/contrib/lib/libc/asr/getnetnamadr.c b/contrib/lib/libc/asr/getnetnamadr.c index 58a297d6..092363d1 100644 --- a/contrib/lib/libc/asr/getnetnamadr.c +++ b/contrib/lib/libc/asr/getnetnamadr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getnetnamadr.c,v 1.2 2012/11/24 15:12:48 eric Exp $ */ +/* $OpenBSD: getnetnamadr.c,v 1.3 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -41,7 +41,7 @@ _fillnetent(const struct netent *e, struct netent *r, char *buf, size_t len) int naliases; end = buf + len; - ptr = (char**)buf; /* XXX align */ + ptr = (char **)buf; /* XXX align */ for (naliases = 0; e->n_aliases[naliases]; naliases++) ; diff --git a/contrib/lib/libc/asr/getnetnamadr_async.c b/contrib/lib/libc/asr/getnetnamadr_async.c index 2db4eee3..b5591bf4 100644 --- a/contrib/lib/libc/asr/getnetnamadr_async.c +++ b/contrib/lib/libc/asr/getnetnamadr_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getnetnamadr_async.c,v 1.7 2012/11/24 18:58:49 eric Exp $ */ +/* $OpenBSD: getnetnamadr_async.c,v 1.8 2013/04/01 15:49:54 deraadt Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -156,7 +156,7 @@ getnetnamadr_async_run(struct async *as, struct async_res *ar) name = dname; in = htonl(as->as.netnamadr.addr); - addr_as_fqdn((char*)&in, + addr_as_fqdn((char *)&in, as->as.netnamadr.family, dname, sizeof(dname)); as->as.netnamadr.subq = res_query_async_ctx( @@ -179,7 +179,7 @@ getnetnamadr_async_run(struct async *as, struct async_res *ar) if (as->as_type == ASR_GETNETBYNAME) data = as->as.netnamadr.name; else - data = (void*)&as->as.netnamadr.addr; + data = (void *)&as->as.netnamadr.addr; n = netent_file_match(f, as->as_type, data); saved_errno = errno; @@ -386,7 +386,7 @@ netent_alloc(int family) n->n.n_addrtype = family; n->n.n_aliases = n->aliases; - n->pos = (char*)(n) + sizeof(*n); + n->pos = (char *)(n) + sizeof(*n); n->end = n->pos + 1024; return (n); diff --git a/contrib/lib/libc/asr/res_mkquery.c b/contrib/lib/libc/asr/res_mkquery.c index f5479d5c..ffd7a34a 100644 --- a/contrib/lib/libc/asr/res_mkquery.c +++ b/contrib/lib/libc/asr/res_mkquery.c @@ -1,4 +1,4 @@ -/* $OpenBSD: res_mkquery.c,v 1.4 2013/03/29 22:51:35 guenther Exp $ */ +/* $OpenBSD: res_mkquery.c,v 1.5 2013/04/01 20:22:27 eric Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -43,8 +43,8 @@ res_mkquery(int op, const char *dname, int class, int type, return (-1); if (dname[0] == '\0' || dname[strlen(dname) - 1] != '.') { - strlcpy(fqdn, dname, sizeof fqdn); - if (strlcat(fqdn, ".", sizeof fqdn) >= sizeof fqdn) + if (strlcpy(fqdn, dname, sizeof(fqdn)) >= sizeof(fqdn) || + strlcat(fqdn, ".", sizeof(fqdn)) >= sizeof(fqdn)) return (-1); dname = fqdn; } @@ -89,13 +89,17 @@ res_querydomain(const char *name, /* we really want domain to end with a dot for now */ if (domain && ((n = strlen(domain)) == 0 || domain[n - 1 ] != '.')) { - strlcpy(ndom, domain, sizeof ndom); - strlcat(ndom, ".", sizeof ndom); + if (strlcpy(ndom, domain, sizeof(ndom)) >= sizeof(ndom) || + strlcat(ndom, ".", sizeof(ndom)) >= sizeof(ndom)) { + h_errno = NETDB_INTERNAL; + errno = EINVAL; + return (-1); + } domain = ndom; } if (asr_make_fqdn(name, domain, fqdn, sizeof fqdn) == 0) { - h_errno = NO_RECOVERY; + h_errno = NETDB_INTERNAL; errno = EINVAL; return (-1); } diff --git a/contrib/lib/libc/asr/res_search_async.c b/contrib/lib/libc/asr/res_search_async.c index 96667676..c4697876 100644 --- a/contrib/lib/libc/asr/res_search_async.c +++ b/contrib/lib/libc/asr/res_search_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: res_search_async.c,v 1.4 2013/03/27 07:40:41 eric Exp $ */ +/* $OpenBSD: res_search_async.c,v 1.6 2013/04/01 20:22:27 eric Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -27,7 +27,7 @@ #include <string.h> #include <unistd.h> -/* +/* * TODO: * * - make it possible to reuse ibuf if it was NULL when first called, @@ -123,7 +123,7 @@ res_search_async_run(struct async *as, struct async_res *ar) async_set_state(as, ASR_STATE_NOT_FOUND); break; } - if (r > sizeof(fqdn)) { + if (r == 0) { ar->ar_errno = EINVAL; ar->ar_h_errno = NO_RECOVERY; ar->ar_datalen = -1; @@ -202,7 +202,7 @@ res_search_async_run(struct async *as, struct async_res *ar) ar->ar_h_errno = NO_DATA; else if (as->as.search.flags & ASYNC_AGAIN) ar->ar_h_errno = TRY_AGAIN; - /* + /* * Else, we got the ar_h_errno value set by res_query_async() * for the last domain. */ diff --git a/contrib/lib/libc/asr/res_send_async.c b/contrib/lib/libc/asr/res_send_async.c index c0a9639f..d60f50c1 100644 --- a/contrib/lib/libc/asr/res_send_async.c +++ b/contrib/lib/libc/asr/res_send_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: res_send_async.c,v 1.9 2013/04/01 07:52:06 eric Exp $ */ +/* $OpenBSD: res_send_async.c,v 1.13 2013/04/02 21:57:33 eric Exp $ */ /* * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> * @@ -25,6 +25,7 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <poll.h> #include <resolv.h> /* for res_random */ #include <stdlib.h> #include <string.h> @@ -80,7 +81,7 @@ res_send_async(const unsigned char *buf, int buflen, unsigned char *ans, } as->as.dns.flags |= ASYNC_EXTOBUF; - as->as.dns.obuf = (unsigned char*)buf; + as->as.dns.obuf = (unsigned char *)buf; as->as.dns.obuflen = buflen; as->as.dns.obufsize = buflen; @@ -339,6 +340,11 @@ sockaddr_connect(const struct sockaddr *sa, int socktype) goto fail; if (connect(sock, sa, SA_LEN(sa)) == -1) { + /* + * In the TCP case, the caller will be asked to poll for + * POLLOUT so that we start writing the packet in tcp_write() + * when the connection is established, or fail there on error. + */ if (errno == EINPROGRESS) return (sock); goto fail; @@ -538,7 +544,7 @@ tcp_write(struct async *as) if (as->as.dns.datalen < sizeof(len)) { offset = 0; len = htons(as->as.dns.obuflen); - iov[i].iov_base = (char*)(&len) + as->as.dns.datalen; + iov[i].iov_base = (char *)(&len) + as->as.dns.datalen; iov[i].iov_len = sizeof(len) - as->as.dns.datalen; i++; } else @@ -578,44 +584,54 @@ close: static int tcp_read(struct async *as) { - uint16_t len; - ssize_t n; - int save_errno; + ssize_t n; + size_t offset, len; + char *pos; + int save_errno, nfds; + struct pollfd pfd; /* We must read the packet len first */ - if (as->as.dns.datalen == 0) { - n = read(as->as_fd, &len, sizeof(len)); + if (as->as.dns.datalen < sizeof(as->as.dns.pktlen)) { + + pos = (char*)(&as->as.dns.pktlen) + as->as.dns.datalen; + len = sizeof(as->as.dns.pktlen) - as->as.dns.datalen; + + n = read(as->as_fd, pos, len); if (n == -1) goto close; /* errno set */ - /* - * If the server has sent us only the first byte, we fail. - * Technically, we could recover but it might not be worth - * supporting that. - */ - if (n < 2) { - errno = EIO; - goto close; - } - as->as.dns.datalen = ntohs(len); - as->as.dns.ibuflen = 0; + as->as.dns.datalen += n; + if (as->as.dns.datalen < sizeof(as->as.dns.pktlen)) + return (1); /* need more data */ - if (ensure_ibuf(as, as->as.dns.datalen) == -1) + as->as.dns.ibuflen = ntohs(as->as.dns.pktlen); + if (ensure_ibuf(as, as->as.dns.ibuflen) == -1) goto close; /* errno set */ + + pfd.fd = as->as_fd; + pfd.events = POLLIN; + nfds = poll(&pfd, 1, 0); + if (nfds == -1) + goto close; /* errno set */ + if (nfds == 0) + return (1); /* no more data available */ } - n = read(as->as_fd, as->as.dns.ibuf + as->as.dns.ibuflen, - as->as.dns.datalen - as->as.dns.ibuflen); + offset = as->as.dns.datalen - sizeof(as->as.dns.pktlen); + pos = as->as.dns.ibuf + offset; + len = as->as.dns.ibuflen - offset; + + n = read(as->as_fd, pos, len); if (n == -1) goto close; /* errno set */ if (n == 0) { errno = ECONNRESET; goto close; } - as->as.dns.ibuflen += n; + as->as.dns.datalen += n; /* See if we got all the advertised bytes. */ - if (as->as.dns.ibuflen != as->as.dns.datalen) + if (as->as.dns.datalen != as->as.dns.ibuflen + sizeof(as->as.dns.pktlen)) return (1); DPRINT_PACKET("asr_tcp_read()", as->as.dns.ibuf, as->as.dns.ibuflen); |