]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Don't exit if the webserver can't accept a connection 4887/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 15 Sep 2016 14:41:32 +0000 (16:41 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 12 Jan 2017 09:22:01 +0000 (10:22 +0100)
This could lead to a Denial Of Service, before we even got a chance
to check that the remote client is allowed by the ACL.

Reported by mongo (thanks!).

pdns/webserver.cc

index 18bd62086c6647f0d8be0cabb5c84a745d8ba10d..6a092373b64e869b2a5ddc8ee0c52fad8fd2cb03 100644 (file)
@@ -35,8 +35,8 @@
 #include <yahttp/router.hpp>
 
 struct connectionThreadData {
-  WebServer* webServer;
-  Socket* client;
+  WebServer* webServer{nullptr};
+  Socket* client{nullptr};
 };
 
 json11::Json HttpRequest::json()
@@ -363,14 +363,31 @@ void WebServer::go()
       // data and data->client will be freed by thread
       connectionThreadData *data = new connectionThreadData;
       data->webServer = this;
-      data->client = d_server->accept();
-      if (data->client->acl(acl)) {
-        pthread_create(&tid, 0, &WebServerConnectionThreadStart, (void *)data);
-      } else {
-        ComboAddress remote;
-        if (data->client->getRemote(remote))
-          L<<Logger::Error<<"Webserver closing socket: remote ("<< remote.toString() <<") does not match 'webserver-allow-from'"<<endl;
-        delete data->client; // close socket
+      try {
+        data->client = d_server->accept();
+        if (data->client->acl(acl)) {
+          pthread_create(&tid, 0, &WebServerConnectionThreadStart, (void *)data);
+        } else {
+          ComboAddress remote;
+          if (data->client->getRemote(remote))
+            L<<Logger::Error<<"Webserver closing socket: remote ("<< remote.toString() <<") does not match 'webserver-allow-from'"<<endl;
+          delete data->client; // close socket
+          delete data;
+        }
+      }
+      catch(PDNSException &e) {
+        L<<Logger::Error<<"PDNSException while accepting a connection in main webserver thread: "<<e.reason<<endl;
+        delete data->client;
+        delete data;
+      }
+      catch(std::exception &e) {
+        L<<Logger::Error<<"STL Exception while accepting a connection in main webserver thread: "<<e.what()<<endl;
+        delete data->client;
+        delete data;
+      }
+      catch(...) {
+        L<<Logger::Error<<"Unknown exception while accepting a connection in main webserver thread"<<endl;
+        delete data->client;
         delete data;
       }
     }