Skip to content
Permalink
Browse files

CURLOPT_DNS_USE_GLOBAL_CACHE: remove

Remove the code too. The functionality has been disabled in code since
7.62.0. Setting this option will from now on simply be ignored and have
no function.

Closes #3654
  • Loading branch information...
bagder committed Mar 7, 2019
1 parent ebc0550 commit f73de32d469919478fba65b5f4fda6212dc730cd
Showing with 35 additions and 119 deletions.
  1. +0 −20 docs/DEPRECATE.md
  2. +4 −2 docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
  3. +0 −1 lib/easy.c
  4. +0 −34 lib/hostip.c
  5. +1 −11 lib/multi.c
  6. +1 −5 lib/setopt.c
  7. +0 −2 lib/urldata.h
  8. +13 −21 tests/unit/unit1607.c
  9. +16 −23 tests/unit/unit1609.c
@@ -5,26 +5,6 @@ email the curl-library mailing list as soon as possible and explain to us why
this is a problem for you and how your use case can't be satisfied properly
using a work around.

## `CURLOPT_DNS_USE_GLOBAL_CACHE`

This option makes libcurl use a global non-thread-safe cache for DNS if
enabled. The option has been marked as "obsolete" in the header file and in
documentation for several years already.

There's proper and safe method alternative provided since many years: the
share API.

### State

In curl 7.62.0 setting this option to TRUE will not have any effect. The
global cache will not be enabled. The code still remains so it is easy to
revert if need be.

### Removal

Remove all global-cache related code from curl around April 2019 (might be
7.66.0).

## HTTP/0.9

Supporting this is non-obvious and might even come as a surprise to some
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -29,6 +29,8 @@ CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,
long enable);
.SH DESCRIPTION
Has no function since 7.62.0. Do note use!

Pass a long. If the \fIenable\fP value is 1, it tells curl to use a global DNS
cache that will survive between easy handle creations and deletions. This is
not thread-safe and this will use a global variable.
@@ -53,7 +55,7 @@ if(curl) {
}
.fi
.SH AVAILABILITY
Subject for removal in the future. Do not use!
Deprecated since 7.62.0. Has no function.
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
@@ -265,7 +265,6 @@ void curl_global_cleanup(void)
if(--initialized)
return;

Curl_global_host_cache_dtor();
Curl_ssl_cleanup();
Curl_resolver_global_cleanup();

@@ -114,42 +114,8 @@
* CURLRES_* defines based on the config*.h and curl_setup.h defines.
*/

/* These two symbols are for the global DNS cache */
static struct curl_hash hostname_cache;
static int host_cache_initialized;

static void freednsentry(void *freethis);

/*
* Curl_global_host_cache_init() initializes and sets up a global DNS cache.
* Global DNS cache is general badness. Do not use. This will be removed in
* a future version. Use the share interface instead!
*
* Returns a struct curl_hash pointer on success, NULL on failure.
*/
struct curl_hash *Curl_global_host_cache_init(void)
{
int rc = 0;
if(!host_cache_initialized) {
rc = Curl_hash_init(&hostname_cache, 7, Curl_hash_str,
Curl_str_key_compare, freednsentry);
if(!rc)
host_cache_initialized = 1;
}
return rc?NULL:&hostname_cache;
}

/*
* Destroy and cleanup the global DNS cache
*/
void Curl_global_host_cache_dtor(void)
{
if(host_cache_initialized) {
Curl_hash_destroy(&hostname_cache);
host_cache_initialized = 0;
}
}

/*
* Return # of addresses in a Curl_addrinfo struct
*/
@@ -402,19 +402,9 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
/* set the easy handle */
multistate(data, CURLM_STATE_INIT);

if((data->set.global_dns_cache) &&
(data->dns.hostcachetype != HCACHE_GLOBAL)) {
/* global dns cache was requested but still isn't */
struct curl_hash *global = Curl_global_host_cache_init();
if(global) {
/* only do this if the global cache init works */
data->dns.hostcache = global;
data->dns.hostcachetype = HCACHE_GLOBAL;
}
}
/* for multi interface connections, we share DNS cache automatically if the
easy handle's one is currently not set. */
else if(!data->dns.hostcache ||
if(!data->dns.hostcache ||
(data->dns.hostcachetype == HCACHE_NONE)) {
data->dns.hostcache = &multi->hostcache;
data->dns.hostcachetype = HCACHE_MULTI;
@@ -128,11 +128,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
data->set.dns_cache_timeout = arg;
break;
case CURLOPT_DNS_USE_GLOBAL_CACHE:
#if 0 /* deprecated */
/* remember we want this enabled */
arg = va_arg(param, long);
data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE;
#endif
/* deprecated */
break;
case CURLOPT_SSL_CIPHER_LIST:
/* set a list of cipher we want to use in the SSL connection */
@@ -1691,7 +1691,6 @@ struct UserDefined {
bit ftp_use_pret:1; /* if PRET is to be used before PASV or not */

bit no_signal:1; /* do not use any signal/alarm handler */
bit global_dns_cache:1; /* subject for future removal */
bit tcp_nodelay:1; /* whether to enable TCP_NODELAY or not */
bit ignorecl:1; /* ignore content length */
bit ftp_skip_ip:1; /* skip the IP address the FTP server passes on to
@@ -1732,7 +1731,6 @@ struct Names {
struct curl_hash *hostcache;
enum {
HCACHE_NONE, /* not pointing to anything */
HCACHE_GLOBAL, /* points to the (shrug) global one */
HCACHE_MULTI, /* points to a shared one in the multi handle */
HCACHE_SHARED /* points to a shared one in a shared object */
} hostcachetype;
@@ -31,12 +31,8 @@ bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);

#include "memdebug.h" /* LAST include file */

static struct Curl_easy *easy;
static struct curl_hash *hostcache;

static void unit_stop(void)
{
curl_easy_cleanup(easy);
curl_global_cleanup();
}

@@ -46,18 +42,6 @@ static CURLcode unit_setup(void)

global_init(CURL_GLOBAL_ALL);

easy = curl_easy_init();
if(!easy) {
curl_global_cleanup();
return CURLE_OUT_OF_MEMORY;
}

hostcache = Curl_global_host_cache_init();
if(!hostcache) {
unit_stop();
return CURLE_OUT_OF_MEMORY;
}

return res;
}

@@ -122,18 +106,25 @@ UNITTEST_START
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);

for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
for(i = 0; i < testnum; ++i) {
int j;
int addressnum = sizeof(tests[i].address) / sizeof(*tests[i].address);
struct Curl_addrinfo *addr;
struct Curl_dns_entry *dns;
struct curl_slist *list;
void *entry_id;
bool problem = false;
struct Curl_multi *multi;
struct Curl_easy *easy = curl_easy_init();
if(!easy) {
curl_global_cleanup();
return CURLE_OUT_OF_MEMORY;
}

Curl_hostcache_clean(easy, hostcache);
easy->dns.hostcache = hostcache;
easy->dns.hostcachetype = HCACHE_GLOBAL;
/* create a multi handle and add the easy handle to it so that the
hostcache is setup */
multi = curl_multi_init();
curl_multi_add_handle(multi, easy);

list = curl_slist_append(NULL, tests[i].optval);
if(!list)
@@ -214,7 +205,8 @@ UNITTEST_START
addr = addr->ai_next;
}

Curl_hostcache_clean(easy, easy->dns.hostcache);
curl_easy_cleanup(easy);
curl_multi_cleanup(multi);
curl_slist_free_all(list);

if(problem) {
@@ -31,12 +31,8 @@ bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);

#include "memdebug.h" /* LAST include file */

static struct Curl_easy *easy;
static struct curl_hash *hostcache;

static void unit_stop(void)
{
curl_easy_cleanup(easy);
curl_global_cleanup();
}

@@ -46,18 +42,6 @@ static CURLcode unit_setup(void)

global_init(CURL_GLOBAL_ALL);

easy = curl_easy_init();
if(!easy) {
curl_global_cleanup();
return CURLE_OUT_OF_MEMORY;
}

hostcache = Curl_global_host_cache_init();
if(!hostcache) {
unit_stop();
return CURLE_OUT_OF_MEMORY;
}

return res;
}

@@ -117,24 +101,32 @@ static const struct testcase tests[] = {
};

UNITTEST_START
{
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);

/* important: we setup cache outside of the loop
and also clean cache after the loop. In contrast,for example,
test 1607 sets up and cleans cache on each iteration. */
Curl_hostcache_clean(easy, hostcache);
easy->dns.hostcache = hostcache;
easy->dns.hostcachetype = HCACHE_GLOBAL;

for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
for(i = 0; i < testnum; ++i) {
int j;
int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address);
struct Curl_addrinfo *addr;
struct Curl_dns_entry *dns;
struct curl_slist *list;
void *entry_id;
bool problem = false;
struct Curl_multi *multi;
struct Curl_easy *easy = curl_easy_init();
if(!easy) {
curl_global_cleanup();
return CURLE_OUT_OF_MEMORY;
}
/* create a multi handle and add the easy handle to it so that the
hostcache is setup */
multi = curl_multi_init();
curl_multi_add_handle(multi, easy);

list = curl_slist_append(NULL, tests[i].optval);
if(!list)
@@ -205,14 +197,15 @@ UNITTEST_START
addr = addr->ai_next;
}

curl_easy_cleanup(easy);
Curl_hash_destroy(&multi->hostcache);
curl_multi_cleanup(multi);
curl_slist_free_all(list);

if(problem) {
unitfail++;
continue;
}
}

Curl_hostcache_clean(easy, easy->dns.hostcache);

}
UNITTEST_STOP

0 comments on commit f73de32

Please sign in to comment.
You can’t perform that action at this time.