chiark / gitweb /
resolved: enforce limit on concurrent outstanding queries
authorLennart Poettering <lennart@poettering.net>
Wed, 16 Jul 2014 23:58:14 +0000 (01:58 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 16 Jul 2014 23:58:14 +0000 (01:58 +0200)
src/resolve/resolved-dns-query.c
src/resolve/resolved.h

index 6e04324da5d9f8b319b139e4e13013dd3b8afe45..fcde03d0ea6e7c50844f11b9614b2f828b0feb55 100644 (file)
@@ -26,6 +26,7 @@
 #define QUERY_TIMEOUT_USEC (30 * USEC_PER_SEC)
 #define ATTEMPTS_MAX 8
 #define CNAME_MAX 8
+#define QUERIES_MAX 2048
 
 static int dns_query_transaction_start(DnsQueryTransaction *t);
 
@@ -403,8 +404,10 @@ DnsQuery *dns_query_free(DnsQuery *q) {
         while (q->transactions)
                 dns_query_transaction_free(q->transactions);
 
-        if (q->manager)
+        if (q->manager) {
                 LIST_REMOVE(queries, q->manager->dns_queries, q);
+                q->manager->n_dns_queries--;
+        }
 
         for (n = 0; n < q->n_keys; n++)
                 free(q->keys[n].name);
@@ -423,6 +426,9 @@ int dns_query_new(Manager *m, DnsQuery **ret, DnsResourceKey *keys, unsigned n_k
         if (n_keys <= 0 || n_keys >= 65535)
                 return -EINVAL;
 
+        if (m->n_dns_queries >= QUERIES_MAX)
+                return -EBUSY;
+
         assert(keys);
 
         q = new0(DnsQuery, 1);
@@ -447,6 +453,7 @@ int dns_query_new(Manager *m, DnsQuery **ret, DnsResourceKey *keys, unsigned n_k
         }
 
         LIST_PREPEND(queries, m->dns_queries, q);
+        m->n_dns_queries++;
         q->manager = m;
 
         if (ret)
index c592a7e8335cba2edbccaf9cf1d8a8000bb05b8c..fecce69481f8576351b9114e7cf7885289f520be 100644 (file)
@@ -56,6 +56,7 @@ struct Manager {
 
         Hashmap *dns_query_transactions;
         LIST_HEAD(DnsQuery, dns_queries);
+        unsigned n_dns_queries;
 
         LIST_HEAD(DnsServer, dns_servers);
         DnsServer *current_dns_server;