diff options
author | cy <cy@FreeBSD.org> | 2017-05-30 03:27:59 +0000 |
---|---|---|
committer | cy <cy@FreeBSD.org> | 2017-05-30 03:27:59 +0000 |
commit | 8d5e39de5335ea7b7c4f715911a64174b8debe3a (patch) | |
tree | 53d989565d05f7b93ca07cab3d8d8756bc775f6e /usr.sbin/nscd | |
parent | 50a2db4a3cd77b4012a248e8e1e6215b34aeb505 (diff) | |
download | FreeBSD-src-8d5e39de5335ea7b7c4f715911a64174b8debe3a.zip FreeBSD-src-8d5e39de5335ea7b7c4f715911a64174b8debe3a.tar.gz |
MFC r318578:
Fix non-recoverable name resolution failures due to negative cache
entries never expiring. This patch honours the negative cache timeout.
To test/experience the failure do the following:
1. Edit /etc/ncd.conf to adjust the cache timeouts as follows:
positive-time-to-live hosts 30
negative-time-to-live hosts 1
2. Ensure that nsswitch.conf hosts line contains something like:
hosts: files cache dns
Note that cache must be specified before dns.
3. Start nscd.
4. Run the following command:
while true; do nc -z -w 3 www.google.com 80; sleep 5; done
5. While running the command, remove or comment out all nameserver
statements in /etc/resolv.conf. After a short while you will notice
non-recoverable name rsolution failures.
6. Uncomment or replace all nameserver statements back into
/etc/resolv.conf. Take note that name resolution never recovers.
To recover nscd must be restarted. This patch fixes this.
PR: 207804
Submitted by: Jov <amutu@amutu.com>
Diffstat (limited to 'usr.sbin/nscd')
-rw-r--r-- | usr.sbin/nscd/query.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/usr.sbin/nscd/query.c b/usr.sbin/nscd/query.c index 270992e..a2b93d6 100644 --- a/usr.sbin/nscd/query.c +++ b/usr.sbin/nscd/query.c @@ -743,9 +743,14 @@ on_read_request_process(struct query_state *qstate) &read_response->data_size); if (read_response->error_code == -2) { - read_response->error_code = 0; - read_response->data = NULL; - read_response->data_size = 0; + read_response->data = malloc( + read_response->data_size); + assert(read_response != NULL); + read_response->error_code = cache_read(neg_c_entry, + read_request->cache_key, + read_request->cache_key_size, + read_response->data, + &read_response->data_size); } } configuration_unlock_entry(qstate->config_entry, CELT_NEGATIVE); |