Changeset 683

Show
Ignore:
Timestamp:
04/12/06 13:32:53 (7 years ago)
Author:
ahu
Message:

fix handling of truncated packets with partial records (like emitted by powerdns hehe)
fix empty PTR, CNAME and NS records (generally a bad idea anyhow)
fix up error reporting a lot

Location:
trunk/pdns/pdns
Files:
7 modified

Legend:

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

    r680 r683  
    192192 
    193193  PacketReader pr(d_content); 
    194  
     194  bool validPacket=false; 
    195195  try { 
    196196    for(n=0;n < d_header.qdcount; ++n) { 
     
    202202    struct dnsrecordheader ah; 
    203203    vector<unsigned char> record; 
    204      
     204    validPacket=true; 
    205205    for(n=0;n < d_header.ancount + d_header.nscount + d_header.arcount; ++n) { 
    206        
    207206      DNSRecord dr; 
    208207       
     
    223222      dr.d_label=label; 
    224223      dr.d_clen=ah.d_clen; 
    225        
     224 
    226225      dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr)); 
    227226      d_answers.push_back(make_pair(dr, pr.d_pos)); 
     
    236235  } 
    237236  catch(out_of_range &re) { 
    238     throw MOADNSException("Error parsing packet of "+lexical_cast<string>(len)+" bytes, out of bounds: "+string(re.what())); 
     237    if(!(validPacket && d_header.tc)) // don't sweat it over truncated packets 
     238      throw MOADNSException("Error parsing packet of "+lexical_cast<string>(len)+" bytes (rd="+ 
     239                            lexical_cast<string>(d_header.rd)+ 
     240                            "), out of bounds: "+string(re.what())); 
    239241  } 
    240242} 
  • trunk/pdns/pdns/dnsparser.hh

    r680 r683  
    5555using namespace std; 
    5656using namespace boost; 
    57 typedef runtime_error MOADNSException; 
     57 
     58class MOADNSException : public runtime_error 
     59{ 
     60public: 
     61  MOADNSException(const string& str) : runtime_error(str) 
     62  {} 
     63}; 
    5864 
    5965struct dnsrecordheader 
  • trunk/pdns/pdns/dnsrecords.hh

    r682 r683  
    299299  }                                                                                                \ 
    300300  catch(RecordTextException& rtr) {                                                                \ 
    301     throw MOADNSParser("Parsing record content: "+string(rtr.what()));                             \ 
     301    throw MOADNSException("Parsing record content: "+string(rtr.what()));                          \ 
    302302  }                                                                                                \ 
    303303}                                                                                                  \ 
  • trunk/pdns/pdns/lwres.cc

    r682 r683  
    158158  catch(exception &mde) { 
    159159    if(::arg().mustDo("log-common-errors")) 
    160       L<<Logger::Error<<"Unable to parse packet from remote server: "<<mde.what()<<"\n"; 
     160      L<<Logger::Error<<"Unable to parse packet from remote server: "<<mde.what()<<endl; 
    161161  } 
    162162  catch(...) { 
  • trunk/pdns/pdns/pdns_recursor.cc

    r680 r683  
    293293void startDoResolve(void *p) 
    294294{ 
     295  DNSComboWriter* dc=(DNSComboWriter *)p; 
    295296  try { 
    296     DNSComboWriter* dc=(DNSComboWriter *)p; 
    297  
    298297    uint16_t maxudpsize=512; 
    299298    MOADNSParser::EDNSOpts edo; 
     
    347346        for(vector<DNSResourceRecord>::const_iterator i=ret.begin();i!=ret.end();++i) { 
    348347          pw.startRecord(i->qname, i->qtype.getCode(), i->ttl, 1, (DNSPacketWriter::Place)i->d_place); 
    349           shared_ptr<DNSRecordContent> drc(DNSRecordContent::mastermake(i->qtype.getCode(), 1, i->content));   
     348           
     349          shared_ptr<DNSRecordContent> drc(DNSRecordContent::mastermake(i->qtype.getCode(), 1, i->content)); 
     350           
    350351          drc->toPacket(pw); 
     352         
    351353          if(!dc->d_tcp && pw.size() > maxudpsize) { 
    352354            pw.rollback(); 
     
    427429  catch(AhuException &ae) { 
    428430    L<<Logger::Error<<"startDoResolve problem: "<<ae.reason<<endl; 
     431  } 
     432  catch(MOADNSException& e) { 
     433    L<<Logger::Error<<"DNS parser error: "<<dc->d_mdp.d_qname<<", "<<e.what()<<endl; 
    429434  } 
    430435  catch(exception& e) { 
     
    969974            try { 
    970975              DNSComboWriter* dc = new DNSComboWriter(data, d_len, now); 
    971  
     976               
    972977              dc->setRemote((struct sockaddr *)&fromaddr, addrlen); 
    973978 
  • trunk/pdns/pdns/rcpgenerator.cc

    r682 r683  
    102102{ 
    103103  skipSpaces(); 
    104  
    105104  val.clear(); 
    106105  val.reserve(d_end - d_pos); 
     
    217216  while(d_pos < d_end && dns_isspace(d_string[d_pos])) 
    218217    d_pos++; 
    219  
    220218  if(d_pos == d_end) 
    221219    throw RecordTextException("missing field at the end of record content '"+d_string+"'"); 
  • trunk/pdns/pdns/recursor_cache.cc

    r671 r683  
    8888      rr.content.append(1,'.'); 
    8989    } 
     90    if(rr.content.empty()) 
     91      rr.content="."; 
    9092  } 
    9193  else { 
    92     shared_ptr<DNSRecordContent> regen=DNSRecordContent::unserialize(qname,qt.getCode(), serial); 
     94    shared_ptr<DNSRecordContent> regen=DNSRecordContent::unserialize(qname, qt.getCode(), serial); 
    9395    rr.content=regen->getZoneRepresentation(); 
    9496  } 
    95  
    9697  //  rr.content.reserve(0); 
    9798  //  rr.qname.reserve(0);