Changeset 2046

Show
Ignore:
Timestamp:
02/19/11 15:57:44 (2 years ago)
Author:
ahu
Message:

add port numbers where relevant to SOA notification output, plus prevent filedescriptor leak on AXFR error

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/pdns/resolver.cc

    r2040 r2046  
    212212   
    213213  if(mdp.d_answers.empty()) 
    214     throw ResolverException("Query to '" + fromaddr.toString() + "' for SOA of '" + *domain + "' produced no results"); 
     214    throw ResolverException("Query to '" + fromaddr.toStringWithPort() + "' for SOA of '" + *domain + "' produced no results"); 
    215215   
    216216  if(mdp.d_qtype != QType::SOA) 
    217     throw ResolverException("Query to '" + fromaddr.toString() + "' for SOA of '" + *domain + "' returned wrong record type"); 
     217    throw ResolverException("Query to '" + fromaddr.toStringWithPort() + "' for SOA of '" + *domain + "' returned wrong record type"); 
    218218 
    219219  *theirInception = *theirExpire = 0; 
     
    299299  else 
    300300    local=ComboAddress("::"); 
    301      
    302   d_sock = makeQuerySocket(local, false); // make a TCP socket 
    303   d_buf = shared_array<char>(new char[65536]); 
    304   d_remote = remote; // mostly for error reporting 
    305   this->connect(); 
    306   d_soacount = 0; 
    307  
    308   vector<uint8_t> packet; 
    309   DNSPacketWriter pw(packet, domain, QType::AXFR); 
    310   pw.getHeader()->id = dns_random(0xffff); 
    311  
    312   if(!tsigkeyname.empty()) { 
    313     d_trc.d_algoName = tsigalgorithm + ".sig-alg.reg.int."; 
    314     d_trc.d_time = time(0); 
    315     d_trc.d_fudge = 300; 
    316     d_trc.d_origID=ntohs(pw.getHeader()->id); 
    317     d_trc.d_eRcode=0; 
    318     addTSIG(pw, &d_trc, tsigkeyname, tsigsecret, "", false); 
    319   } 
    320  
    321   uint16_t replen=htons(packet.size()); 
    322   Utility::iovec iov[2]; 
    323   iov[0].iov_base=(char*)&replen; 
    324   iov[0].iov_len=2; 
    325   iov[1].iov_base=(char*)&packet[0]; 
    326   iov[1].iov_len=packet.size(); 
    327  
    328   int ret=Utility::writev(d_sock, iov,2); 
    329   if(ret<0) 
    330     throw ResolverException("Error sending question to "+d_remote.toStringWithPort()+": "+stringerror()); 
    331  
    332   int res = waitForData(d_sock, 10, 0); 
    333    
    334   if(!res) 
    335     throw ResolverException("Timeout waiting for answer from "+d_remote.toStringWithPort()+" during AXFR"); 
    336   if(res<0) 
    337     throw ResolverException("Error waiting for answer from "+d_remote.toStringWithPort()+": "+stringerror()); 
     301  d_sock = -1; 
     302  try { 
     303    d_sock = makeQuerySocket(local, false); // make a TCP socket 
     304    d_buf = shared_array<char>(new char[65536]); 
     305    d_remote = remote; // mostly for error reporting 
     306    this->connect(); 
     307    d_soacount = 0; 
     308   
     309    vector<uint8_t> packet; 
     310    DNSPacketWriter pw(packet, domain, QType::AXFR); 
     311    pw.getHeader()->id = dns_random(0xffff); 
     312   
     313    if(!tsigkeyname.empty()) { 
     314      d_trc.d_algoName = tsigalgorithm + ".sig-alg.reg.int."; 
     315      d_trc.d_time = time(0); 
     316      d_trc.d_fudge = 300; 
     317      d_trc.d_origID=ntohs(pw.getHeader()->id); 
     318      d_trc.d_eRcode=0; 
     319      addTSIG(pw, &d_trc, tsigkeyname, tsigsecret, "", false); 
     320    } 
     321   
     322    uint16_t replen=htons(packet.size()); 
     323    Utility::iovec iov[2]; 
     324    iov[0].iov_base=(char*)&replen; 
     325    iov[0].iov_len=2; 
     326    iov[1].iov_base=(char*)&packet[0]; 
     327    iov[1].iov_len=packet.size(); 
     328   
     329    int ret=Utility::writev(d_sock, iov,2); 
     330    if(ret<0) 
     331      throw ResolverException("Error sending question to "+d_remote.toStringWithPort()+": "+stringerror()); 
     332   
     333    int res = waitForData(d_sock, 10, 0); 
     334     
     335    if(!res) 
     336      throw ResolverException("Timeout waiting for answer from "+d_remote.toStringWithPort()+" during AXFR"); 
     337    if(res<0) 
     338      throw ResolverException("Error waiting for answer from "+d_remote.toStringWithPort()+": "+stringerror()); 
     339  } 
     340  catch(...) { 
     341    if(d_sock >= 0) 
     342      close(d_sock); 
     343    throw; 
     344  } 
    338345} 
    339346