]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
fix TCP related crashes due to HUUUUGE daum.net records (3.5kbyte!)
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 11 Jul 2005 18:27:36 +0000 (18:27 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 11 Jul 2005 18:27:36 +0000 (18:27 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@440 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/lwres.cc
pdns/pdns_recursor.cc
pdns/syncres.cc

index 7068bcb9ff1f01f012d0e646b894f49b330b8791..0f60d57bb51799dedd9bf051524c2f86606306e5 100644 (file)
@@ -91,12 +91,13 @@ int LWRes::asyncresolve(const string &ip, const char *domain, int type, bool doT
     ret=arecvfrom(reinterpret_cast<char *>(d_buf), d_bufsize-1,0,(struct sockaddr*)(&toaddr), &addrlen, &d_len, p.d.id);
   }
   else {
+    //    cerr<<"do tcp"<<endl;
     Socket s(InterNetwork, Stream);
     IPEndpoint ie(ip, 53);
     s.setNonBlocking();
     s.connect(ie);
 
-    int len=htons(p.len);
+    unsigned int len=htons(p.len);
     char *lenP=(char*)&len;
     const char *msgP=p.getData();
     string packet=string(lenP, lenP+2)+string(msgP, msgP+p.len);
@@ -121,7 +122,11 @@ int LWRes::asyncresolve(const string &ip, const char *domain, int type, bool doT
       //      cerr<<"arecvtcp: timeout"<<endl;
       return 0;
     }
-
+    if(len > d_bufsize) {
+      d_bufsize=len;
+      delete[] d_buf;
+      d_buf = new unsigned char[d_bufsize];
+    }
     memcpy(d_buf, packet.c_str(), len);
     d_len=len;
     ret=1;
index fbc94d7c5068d6b51422c910759696f6dba1bc52..eb1fa71bd5379f49368699be7c681eef3eca4199 100644 (file)
@@ -246,8 +246,9 @@ void startDoResolve(void *p)
     const char *buffer=R->getData();
 
     if(!R->d_tcp) {
-      if(R->len > 512) 
+      if(R->len > 512) {
        R->truncate(512);
+      }
 
       sendto(R->getSocket(),buffer,R->len,0,(struct sockaddr *)(R->remote),R->d_socklen);
     }
index 7a66b8c0558b80a3aa2e75bbac4579b12994c4d7..91dddf97bb79525c72417d4ebe2cdefa34b3226b 100644 (file)
@@ -411,7 +411,7 @@ int SyncRes::doResolveAt(set<string> nameservers, string auth, const string &qna
       }
 
       result=d_lwr.result();
-
+      
       if(d_lwr.d_tcbit) {
        if(!doTCP) {
          doTCP=true;