getaddrinfo_async() shouldn't unconditionally intialize the resolver
authorderaadt <deraadt@openbsd.org>
Wed, 7 Oct 2015 13:59:34 +0000 (13:59 +0000)
committerderaadt <deraadt@openbsd.org>
Wed, 7 Oct 2015 13:59:34 +0000 (13:59 +0000)
via _asr_use_resolver().  If the hint specifies for AI_NUMERICHOST,
create a transient lookup context which won't try to open /etc/reslov.conf
ok eric guenther

lib/libc/asr/asr.c
lib/libc/asr/asr_private.h
lib/libc/asr/getaddrinfo_async.c

index 1f6429f..7c13122 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: asr.c,v 1.45 2015/10/03 22:35:30 deraadt Exp $        */
+/*     $OpenBSD: asr.c,v 1.46 2015/10/07 13:59:34 deraadt Exp $        */
 /*
  * Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org>
  *
@@ -489,6 +489,12 @@ asr_ctx_create(void)
        return (ac);
 }
 
+struct asr_ctx *
+_asr_no_resolver(void)
+{
+       return asr_ctx_create();
+}
+
 /*
  * Add a search domain to the async context.
  */
index 82ad6dc..cef9cae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: asr_private.h,v 1.34 2015/10/03 22:35:30 deraadt Exp $        */
+/*     $OpenBSD: asr_private.h,v 1.35 2015/10/07 13:59:34 deraadt Exp $        */
 /*
  * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
  *
@@ -315,6 +315,7 @@ ssize_t _asr_addr_as_fqdn(const char *, int, char *, size_t);
 static void *_asr_resolver(void);
 void _asr_resolver_done(void *);
 struct asr_ctx *_asr_use_resolver(void *);
+struct asr_ctx *_asr_no_resolver(void);
 void _asr_ctx_unref(struct asr_ctx *);
 struct asr_query *_asr_async_new(struct asr_ctx *, int);
 void _asr_async_free(struct asr_query *);
index d3e7c56..4362da5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: getaddrinfo_async.c,v 1.45 2015/09/20 14:19:21 eric Exp $     */
+/*     $OpenBSD: getaddrinfo_async.c,v 1.46 2015/10/07 13:59:34 deraadt Exp $  */
 /*
  * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
  *
@@ -88,7 +88,10 @@ getaddrinfo_async(const char *hostname, const char *servname,
        struct asr_query        *as;
        char                     alias[MAXDNAME];
 
-       ac = _asr_use_resolver(asr);
+       if ((hints->ai_flags & AI_NUMERICHOST) == 0)
+               ac = _asr_use_resolver(asr);
+       else
+               ac = _asr_no_resolver();
        if ((as = _asr_async_new(ac, ASR_GETADDRINFO)) == NULL)
                goto abort; /* errno set */
        as->as_run = getaddrinfo_async_run;