aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorCharles Longeau <github@chl.be>2013-04-03 13:01:23 +0200
committerCharles Longeau <github@chl.be>2013-04-03 13:01:23 +0200
commit92ecda846a41f85e6cfcda7eafa127fa7e5d56e8 (patch)
treedc7a2387fd331fdfea9d8296df58f504ea60b4c2 /contrib
parentMerge branch 'master' into portable (diff)
downloadOpenSMTPD-92ecda846a41f85e6cfcda7eafa127fa7e5d56e8.tar.xz
OpenSMTPD-92ecda846a41f85e6cfcda7eafa127fa7e5d56e8.zip
sync with latest asr changes
Diffstat (limited to 'contrib')
-rw-r--r--contrib/lib/libc/asr/CVS/Entries44
-rw-r--r--contrib/lib/libc/asr/asr.c65
-rw-r--r--contrib/lib/libc/asr/asr.h6
-rw-r--r--contrib/lib/libc/asr/asr_debug.c20
-rw-r--r--contrib/lib/libc/asr/asr_private.h15
-rw-r--r--contrib/lib/libc/asr/asr_utils.c26
-rw-r--r--contrib/lib/libc/asr/async_resolver.326
-rw-r--r--contrib/lib/libc/asr/getaddrinfo_async.c6
-rw-r--r--contrib/lib/libc/asr/gethostnamadr.c10
-rw-r--r--contrib/lib/libc/asr/gethostnamadr_async.c4
-rw-r--r--contrib/lib/libc/asr/getnetnamadr.c4
-rw-r--r--contrib/lib/libc/asr/getnetnamadr_async.c8
-rw-r--r--contrib/lib/libc/asr/res_mkquery.c16
-rw-r--r--contrib/lib/libc/asr/res_search_async.c8
-rw-r--r--contrib/lib/libc/asr/res_send_async.c64
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);