From 39762fdf67fd338e442abd25246ea4f0248f9bff Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 17 Jul 2014 01:58:14 +0200 Subject: [PATCH] resolved: enforce limit on concurrent outstanding queries --- src/resolve/resolved-dns-query.c | 9 ++++++++- src/resolve/resolved.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 6e04324da..fcde03d0e 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 c592a7e83..fecce6948 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; -- 2.30.2