teach dynhandler to reject non-ip address parameters to notify-host
plus defense in depth, make powerdns not exit if asked to notify non-ip address
Close ticket 24
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@565
d19b8d6e-7fed-0310-83ef-
9ca221ded41b
bool purged;
while(d_nq.getOne(domain, ip, &id, purged)) {
if(!purged) {
- d_nresolver.notify(d_nsock,domain,ip,id);
- drillHole(domain,ip);
+ try {
+ d_nresolver.notify(d_nsock, domain, ip, id);
+ drillHole(domain, ip);
+ }
+ catch(ResolverException &re) {
+ L<<Logger::Error<<"Error trying to resolve '"+ip+"' for notifying '"+domain+"' to server: "+re.reason<<endl;
+ }
}
else
L<<Logger::Error<<Logger::NTLog<<"Notification for "<<domain<<" to "<<ip<<" failed after retries"<<endl;
void CommunicatorClass::notify(const string &domain, const string &ip)
{
- d_nq.add(domain,ip);
+ d_nq.add(domain, ip);
d_any_sem.post();
}
// fill out data with some plausible defaults:
// 10800 3600 604800 3600
data.serial=0;
- data.refresh=arg().asNum("soa-refresh-default");;
- data.retry=arg().asNum("soa-retry-default");;
- data.expire=arg().asNum("soa-expire-default");;
+ data.refresh=arg().asNum("soa-refresh-default");
+ data.retry=arg().asNum("soa-retry-default");
+ data.expire=arg().asNum("soa-expire-default");
data.default_ttl=arg().asNum("soa-minimum-ttl");
vector<string>parts;
ostringstream os;
if(parts.size()!=3)
return "syntax: notify-host domain ip";
+
+ struct in_addr inp;
+ if(!Utility::inet_aton(parts[2].c_str(),&inp))
+ return "Unable to convert '"+parts[2]+"' to an IP address";
+
L<<Logger::Warning<<"Notification request to host "<<parts[2]<<" for domain '"<<parts[1]<<"' received"<<endl;
Communicator.notify(parts[1],parts[2]);
return "Added to queue";
p.spoofID(id);
struct in_addr inp;
- Utility::inet_aton(ip.c_str(),&inp);
+ if(!Utility::inet_aton(ip.c_str(),&inp))
+ throw ResolverException("Unable to convert '"+ip+"' to an IP address");
struct sockaddr_in toaddr;
toaddr.sin_addr.s_addr=inp.s_addr;