diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-07-17 01:58:14 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-07-17 01:58:14 +0200 |
commit | 39762fdf67fd338e442abd25246ea4f0248f9bff (patch) | |
tree | c1e267309af1538ad2820ec0ec2aaf00d7c8de65 | |
parent | 634af5665fda8776d22624d947c8de830e30a874 (diff) |
resolved: enforce limit on concurrent outstanding queries
-rw-r--r-- | src/resolve/resolved-dns-query.c | 9 | ||||
-rw-r--r-- | src/resolve/resolved.h | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 6e04324da5..fcde03d0ea 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -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) diff --git a/src/resolve/resolved.h b/src/resolve/resolved.h index c592a7e833..fecce69481 100644 --- a/src/resolve/resolved.h +++ b/src/resolve/resolved.h @@ -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; |