From b692f23466eb28ceed42c4e1d312707636afff09 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 9 May 2014 10:29:43 +0100 Subject: [PATCH] Fix DNS failure of cachesize set to zero. --- CHANGELOG | 4 ++++ src/blockdata.c | 15 ++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 55c33b9..6c3782d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,6 +11,10 @@ version 2.71 Fix DNSSEC validation of ANY queries. Thanks to Marco Davids for spotting that too. + Fix total DNS failure and 100% CPU use if cachesize set to zero, + regression introduced in 2.69. Thanks to James Hunt and + the Ubuntu crowd for assistance in fixing this. + version 2.70 Fix crash, introduced in 2.69, on TCP request when dnsmasq diff --git a/src/blockdata.c b/src/blockdata.c index 272d3a6..5a70a79 100644 --- a/src/blockdata.c +++ b/src/blockdata.c @@ -25,7 +25,7 @@ static void blockdata_expand(int n) { struct blockdata *new = whine_malloc(n * sizeof(struct blockdata)); - if (new) + if (n > 0 && new) { int i; @@ -46,14 +46,19 @@ void blockdata_init(void) blockdata_alloced = 0; blockdata_count = 0; blockdata_hwm = 0; - - blockdata_expand((daemon->cachesize * 100) / sizeof(struct blockdata)); + + /* Note that daemon->cachesize is enforced to have non-zero size if OPT_DNSSEC_VALID is set */ + if (option_bool(OPT_DNSSEC_VALID)) + blockdata_expand((daemon->cachesize * 100) / sizeof(struct blockdata)); } void blockdata_report(void) { - my_syslog(LOG_INFO, _("DNSSEC memory in use %u, max %u, allocated %u"), - blockdata_count * sizeof(struct blockdata), blockdata_hwm * sizeof(struct blockdata), blockdata_alloced * sizeof(struct blockdata)); + if (option_bool(OPT_DNSSEC_VALID)) + my_syslog(LOG_INFO, _("DNSSEC memory in use %u, max %u, allocated %u"), + blockdata_count * sizeof(struct blockdata), + blockdata_hwm * sizeof(struct blockdata), + blockdata_alloced * sizeof(struct blockdata)); } struct blockdata *blockdata_alloc(char *data, size_t len)