summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2014-05-09 10:29:43 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-05-09 10:29:43 +0100
commitb692f23466eb28ceed42c4e1d312707636afff09 (patch)
tree77fc77ccbeb7a4d0e100437bde398bbff6e935d5
parent8aa999ef69f3978faa4788e390edb4ed44dfc11e (diff)
downloaddnsmasq-b692f23466eb28ceed42c4e1d312707636afff09.tar.gz
Fix DNS failure of cachesize set to zero.v2.71test2
-rw-r--r--CHANGELOG4
-rw-r--r--src/blockdata.c15
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)