diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2014-05-09 10:29:43 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2014-05-09 10:29:43 +0100 |
commit | b692f23466eb28ceed42c4e1d312707636afff09 (patch) | |
tree | 77fc77ccbeb7a4d0e100437bde398bbff6e935d5 | |
parent | 8aa999ef69f3978faa4788e390edb4ed44dfc11e (diff) | |
download | dnsmasq-b692f23466eb28ceed42c4e1d312707636afff09.tar.gz |
Fix DNS failure of cachesize set to zero.v2.71test2
-rw-r--r-- | CHANGELOG | 4 | ||||
-rw-r--r-- | src/blockdata.c | 15 |
2 files changed, 14 insertions, 5 deletions
@@ -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) |