From 97ce13bea038e4e2bc3c3294090ca3b2ef48d1d1 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 4 Aug 2016 19:00:07 +0200 Subject: [PATCH] auth: Catch out_of_range exception when parsing serial --- pdns/dnsbackend.cc | 25 +++++++++++++++---------- pdns/zoneparser-tng.cc | 9 ++++++++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/pdns/dnsbackend.cc b/pdns/dnsbackend.cc index aa527bf0a5..a3f7225369 100644 --- a/pdns/dnsbackend.cc +++ b/pdns/dnsbackend.cc @@ -337,20 +337,25 @@ void fillSOAData(const string &content, SOAData &data) if(pleft>1) data.hostmaster=DNSName(attodot(parts[1])); // ahu@ds9a.nl -> ahu.ds9a.nl, piet.puk@ds9a.nl -> piet\.puk.ds9a.nl - data.serial = pleft > 2 ? pdns_stou(parts[2]) : 0; - if (data.serial == UINT_MAX && errno == ERANGE) throw PDNSException("serial number too large in '"+parts[2]+"'"); + try { + data.serial = pleft > 2 ? pdns_stou(parts[2]) : 0; + if (data.serial == UINT_MAX && errno == ERANGE) throw PDNSException("serial number too large in '"+parts[2]+"'"); - data.refresh = pleft > 3 ? pdns_stou(parts[3]) - : ::arg().asNum("soa-refresh-default"); + data.refresh = pleft > 3 ? pdns_stou(parts[3]) + : ::arg().asNum("soa-refresh-default"); - data.retry = pleft > 4 ? pdns_stou(parts[4].c_str()) - : ::arg().asNum("soa-retry-default"); + data.retry = pleft > 4 ? pdns_stou(parts[4].c_str()) + : ::arg().asNum("soa-retry-default"); - data.expire = pleft > 5 ? pdns_stou(parts[5].c_str()) - : ::arg().asNum("soa-expire-default"); + data.expire = pleft > 5 ? pdns_stou(parts[5].c_str()) + : ::arg().asNum("soa-expire-default"); - data.default_ttl = pleft > 6 ? pdns_stou(parts[6].c_str()) - : ::arg().asNum("soa-minimum-ttl"); + data.default_ttl = pleft > 6 ? pdns_stou(parts[6].c_str()) + : ::arg().asNum("soa-minimum-ttl"); + } + catch(const std::out_of_range& oor) { + throw PDNSException("Out of range exception parsing "+content); + } } string serializeSOAData(const SOAData &d) diff --git a/pdns/zoneparser-tng.cc b/pdns/zoneparser-tng.cc index c4f4becba4..16afed6675 100644 --- a/pdns/zoneparser-tng.cc +++ b/pdns/zoneparser-tng.cc @@ -102,7 +102,14 @@ unsigned int ZoneParserTNG::makeTTLFromZone(const string& str) if(str.empty()) return 0; - unsigned int val=pdns_stou(str); + unsigned int val; + try { + val=pdns_stou(str); + } + catch (const std::out_of_range& oor) { + throw PDNSException("Unable to parse time specification '"+str+"' "+getLineOfFile()); + } + char lc=dns_tolower(str[str.length()-1]); if(!isdigit(lc)) switch(lc) { -- 2.47.2