From: Daniel Kempenich Date: Fri, 27 Jan 2023 07:44:41 +0000 (+0100) Subject: Allow evdns_base_new to succeed with no nameservers configured X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ebd7e8d7930df0ef9f11a23309c59cded735e7c4;p=libevent Allow evdns_base_new to succeed with no nameservers configured If resolv.conf has no nameservers, evdns_base_new can still succeed with the default of using the name server from localhost matching the man page documentation for resolv.conf. --- diff --git a/evdns.c b/evdns.c index 52e7ee62..05e515c0 100644 --- a/evdns.c +++ b/evdns.c @@ -4892,7 +4892,7 @@ evdns_base_new(struct event_base *event_base, int flags) #else r = evdns_base_resolv_conf_parse(base, opts, "/etc/resolv.conf"); #endif - if (r) { + if (r && (EVDNS_ERROR_NO_NAMESERVERS_CONFIGURED != r)) { evdns_base_free_and_unlock(base, 0); return NULL; } diff --git a/test/regress_dns.c b/test/regress_dns.c index 4e247b34..e28ad52b 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -42,6 +42,9 @@ #include #ifndef _WIN32 #include +#include +#include +#include #include #include #include @@ -1218,6 +1221,39 @@ end: if (dns) evdns_base_free(dns, 0); } + +static void +dns_nameservers_no_nameservers_configured_test(void *arg) +{ + struct basic_test_data *data = arg; + struct event_base *base = data->base; + struct evdns_base *dns = NULL; + int fd = -1; + char *tmpfilename = NULL; + const char filecontents[] = "# tmp empty resolv.conf\n"; + const size_t filecontentssize = sizeof(filecontents); + int ok; + + fd = regress_make_tmpfile(filecontents, filecontentssize, &tmpfilename); + if (fd < 0) + tt_skip(); + + dns = evdns_base_new(base, 0); + tt_assert(dns); + + ok = evdns_base_resolv_conf_parse(dns, DNS_OPTIONS_ALL, tmpfilename); + tt_int_op(ok, ==, EVDNS_ERROR_NO_NAMESERVERS_CONFIGURED); + +end: + if (fd != -1) + close(fd); + if (dns) + evdns_base_free(dns, 0); + if (tmpfilename) { + unlink(tmpfilename); + free(tmpfilename); + } +} #endif /* === Test for bufferevent_socket_connect_hostname */ @@ -3007,6 +3043,8 @@ struct testcase_t dns_testcases[] = { #ifndef _WIN32 { "nameservers_no_default", dns_nameservers_no_default_test, TT_FORK|TT_NEED_BASE, &basic_setup, NULL }, + { "no_nameservers_configured", dns_nameservers_no_nameservers_configured_test, + TT_FORK|TT_NEED_BASE, &basic_setup, NULL }, #endif { "getaddrinfo_async", test_getaddrinfo_async, diff --git a/test/regress_main.c b/test/regress_main.c index 489c74b7..a504d6ce 100644 --- a/test/regress_main.c +++ b/test/regress_main.c @@ -144,11 +144,11 @@ regress_make_tmpfile(const void *data, size_t datalen, char **filename_out) return (-1); if (write(fd, data, datalen) != (int)datalen) { close(fd); + unlink(tmpfilename); return (-1); } lseek(fd, 0, SEEK_SET); - /* remove it from the file system */ - unlink(tmpfilename); + *filename_out = strdup(tmpfilename); return (fd); #else /* XXXX actually delete the file later */