cURL
Haxx ad
libcurl

curl's project page on SourceForge.net

Sponsors:
Haxx

cURL > Mailing List > Monthly Index > Single Mail

curl-tracker Archives

[curl:bugs] #1303 libcurl not refreshing DNS entries populated with CURLOPT_RESOLVE

From: Daniel Stenberg <bagder_at_users.sf.net>
Date: Mon, 25 Nov 2013 21:41:22 +0000

- **status**: open-confirmed --> closed-fixed

---
** [bugs:#1303] libcurl not refreshing DNS entries populated with CURLOPT_RESOLVE**
**Status:** closed-fixed
**Created:** Wed Nov 13, 2013 04:38 PM UTC by Romulo A. Ceccon
**Last Updated:** Sun Nov 17, 2013 11:31 PM UTC
**Owner:** Daniel Stenberg
Tested on: Ubuntu/Linux 3.11.0-12-generic, [curl 7.34.0-DEV][1].
This [has already been discussed][2] at the curl-library mailing list.
I use the multi interface to cache the connections to some server between requests and CURLOPT_RESOLVE to populate the DNS cache (my scenario is a private GPRS network with no working DNS servers). But even though I initialize the DNS entries with every easy handle libcurl sometimes considers them expired when initiating the connection. As a result libcurl tries to reach one of the default DNS servers, which always results in a CURLE_COULDNT_RESOLVE_HOST in my case.
The documentation states that CURLOPT_RESOLVE just pre-populates the DNS cache, which implies it should follow the same rules about expiration. But since I'm setting the option with every easy handle I would expect the entries to be "refreshed". Moreover, there's a timing issue: depending on how much you wait before the requests libcurl will indeed "refresh" the entries. So, at the very least, the behaviour is not consistent.
I attached a program demonstrating the problem, also available at: <https://gist.github.com/romuloceccon/6941606>. It outputs the following. Note that you can't reproduce it when omitting the call to sleep():
    debug: Added fake.host:80:137.56.161.173 to DNS cache
    debug: About to connect() to fake.host port 80 (#0)
    debug:   Trying 137.56.161.173...
    debug: Adding handle: conn: 0xb81160
    debug: Adding handle: send: 0
    debug: Adding handle: recv: 0
    debug: Curl_addHandleToPipeline: length: 1
    debug: - Conn 0 (0xb81160) send_pipe: 1, recv_pipe: 0
    debug: Connected to fake.host (137.56.161.173) port 80 (#0)
    debug: Server lighttpd/1.4.28 is not blacklisted
    debug: Closing connection 0
    HTTP transfer completed with status 0
    debug: Added fake.host:80:137.56.161.173 to DNS cache
    debug: getaddrinfo(3) failed for fake.host:80
    debug: Couldn't resolve host 'fake.host'
    debug: Closing connection 1
    HTTP transfer completed with status 6
I managed to fix it by patching Curl_loadhostpairs() with code copied from Curl_cache_addr(), but because of the timing issue I think it's just covering the real bug somewhere else:
    :::diff
    diff --git a/lib/hostip.c b/lib/hostip.c
    index f37b492..4157a2a 100644
    --- a/lib/hostip.c
    +++ b/lib/hostip.c
    @@ -807,8 +807,15 @@ CURLcode Curl_loadhostpairs(struct SessionHandle *data)
             /* if not in the cache already, put this host in the cache */
             dns = Curl_cache_addr(data, addr, hostname, port);
           else
    +      {
             /* this is a duplicate, free it again */
             Curl_freeaddrinfo(addr);
    +        
    +        /* reset timestamp */
    +        time(&dns->timestamp);
    +        if(dns->timestamp == 0)
    +          dns->timestamp = 1;   /* zero indicates that entry isn't in hash table */
    +      }
     
           if(data->share)
             Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
[1]: https://github.com/bagder/curl/commit/c5d73167a63010e8f0337a43adac7064a44bcef0
[2]: http://curl.haxx.se/mail/lib-2013-10/0062.html
---
Sent from sourceforge.net because curl-tracker@cool.haxx.se is subscribed to https://sourceforge.net/p/curl/bugs/
To unsubscribe from further messages, a project admin can change settings at https://sourceforge.net/p/curl/admin/bugs/options.  Or, if this is a mailing list, you can unsubscribe from the mailing list.
Received on 2013-11-25

These mail archives are generated by hypermail.

donate! Page updated May 06, 2013.
web site info

File upload with ASP.NET