]> granicus.if.org Git - pdns/commitdiff
**BREAKING** dnsdist console communications control break: we now support 32 bit...
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 9 Dec 2015 06:45:40 +0000 (07:45 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Wed, 9 Dec 2015 06:45:40 +0000 (07:45 +0100)
pdns/dnsdist-tcp.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index e1766e1eedc0a8f0e06a4ef894c31d29fe8de3ff..3b77395aab1aa6ee477f1ecba9db48d468bff8d1 100644 (file)
@@ -446,24 +446,26 @@ void* tcpAcceptorThread(void* p)
 }
 
 
-bool getMsgLen(int fd, uint16_t* len)
+bool getMsgLen32(int fd, uint32_t* len)
 try
 {
-  uint16_t raw;
+  uint32_t raw;
   int ret = readn2(fd, &raw, sizeof raw);
   if(ret != sizeof raw)
     return false;
-  *len = ntohs(raw);
+  *len = ntohl(raw);
+  if(*len > 10000000) // arbitrary 10MB limit
+    return false;
   return true;
 }
 catch(...) {
    return false;
 }
 
-bool putMsgLen(int fd, uint16_t len)
+bool putMsgLen32(int fd, uint32_t len)
 try
 {
-  uint16_t raw = htons(len);
+  uint32_t raw = htonl(len);
   int ret = writen2(fd, &raw, sizeof raw);
   return ret==sizeof raw;
 }
index a40d37eb9e8b702275554d3fc476c4720d7985f9..0dc0771d42b6f1a7a40c41d99eab4996734f7dc1 100644 (file)
@@ -776,13 +776,13 @@ try
   writen2(fd, (char*)ours.value, sizeof(ours.value));
 
   for(;;) {
-    uint16_t len;
-    if(!getMsgLen(fd, &len))
+    uint32_t len;
+    if(!getMsgLen32(fd, &len))
       break;
-    char msg[len];
-    readn2(fd, msg, len);
+    boost::scoped_array<char> msg(new char[len]);
+    readn2(fd, msg.get(), len);
     
-    string line(msg, len);
+    string line(msg.get(), len);
     line = sodDecryptSym(line, g_key, theirs);
     //    cerr<<"Have decrypted line: "<<line<<endl;
     string response;
@@ -827,8 +827,8 @@ try
       response = "Error: " + string(e.what()) + ": ";
     }
     response = sodEncryptSym(response, g_key, ours);
-    putMsgLen(fd, response.length());
-    writen2(fd, response.c_str(), (uint16_t)response.length());
+    putMsgLen32(fd, response.length());
+    writen2(fd, response.c_str(), response.length());
   }
   infolog("Closed control connection from %s", client.toStringWithPort());
   close(fd);
@@ -877,14 +877,14 @@ static void doClient(ComboAddress server, const std::string& command)
   if(!command.empty()) {
     string response;
     string msg=sodEncryptSym(command, g_key, ours);
-    putMsgLen(fd, msg.length());
+    putMsgLen32(fd, msg.length());
     if(!msg.empty())
       writen2(fd, msg);
-    uint16_t len;
-    getMsgLen(fd, &len);
-    char resp[len];
-    readn2(fd, resp, len);
-    msg.assign(resp, len);
+    uint32_t len;
+    getMsgLen32(fd, &len);
+    boost::scoped_array<char> resp(new char[len]);
+    readn2(fd, resp.get(), len);
+    msg.assign(resp.get(), len);
     msg=sodDecryptSym(msg, g_key, theirs);
     cout<<msg<<endl;
     return; 
@@ -919,19 +919,17 @@ static void doClient(ComboAddress server, const std::string& command)
 
     string response;
     string msg=sodEncryptSym(line, g_key, ours);
-    putMsgLen(fd, msg.length());
+    putMsgLen32(fd, msg.length());
     writen2(fd, msg);
-    uint16_t len;
-    getMsgLen(fd, &len);
-
-    if(len == 0) {
+    uint32_t len;
+    if(!getMsgLen32(fd, &len) || len == 0) {
       cout << "Connection closed by the server." << endl;
       break;
     }
 
-    char resp[len];
-    readn2(fd, resp, len);
-    msg.assign(resp, len);
+    boost::scoped_array<char> resp(new char[len]);
+    readn2(fd, resp.get(), len);
+    msg.assign(resp.get(), len);
     msg=sodDecryptSym(msg, g_key, theirs);
     cout<<msg<<endl;
   }
index c2178abd376eb6bc3305bcbeb77a18dc8a3bde40..fe2867f6e499a0d320b130bce7f52e360976a9d8 100644 (file)
@@ -422,8 +422,8 @@ std::shared_ptr<DownstreamState> roundrobin(const NumberedServerVector& servers,
 int getEDNSZ(const char* packet, unsigned int len);
 uint16_t getEDNSOptionCode(const char * packet, size_t len);
 void dnsdistWebserverThread(int sock, const ComboAddress& local, const string& password);
-bool getMsgLen(int fd, uint16_t* len);
-bool putMsgLen(int fd, uint16_t len);
+bool getMsgLen32(int fd, uint32_t* len);
+bool putMsgLen32(int fd, uint32_t len);
 void* tcpAcceptorThread(void* p);
 
 void moreLua();