]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix a leak of query fetchlock (#38454)
authorMukund Sivaraman <muks@isc.org>
Tue, 3 Feb 2015 06:12:58 +0000 (11:42 +0530)
committerMukund Sivaraman <muks@isc.org>
Tue, 3 Feb 2015 06:12:58 +0000 (11:42 +0530)
4052. [bug] Fix a leak of query fetchlock. [RT #38454]

CHANGES
bin/named/client.c
bin/named/query.c

diff --git a/CHANGES b/CHANGES
index 8f7a9d78b849a9e7aca557354c72196b8e808190..d476ed1c6d9fc1f16e45b0a9ee80c19fa2ba0a31 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+4052.  [bug]           Fix a leak of query fetchlock. [RT #38454]
+
 4051.  [bug]           Fix a leak of pthread_mutexattr_t. [RT #38454]
 
 4050.  [cleanup]       Silence occasional spurious "duplicate query" log
index 143a6a14943e5691cc4f23a9c91187280d992004..326f7250aebe4f23d1e3c3114915c3a084d982cc 100644 (file)
@@ -556,6 +556,17 @@ exit_check(ns_client_t *client) {
                INSIST(client->recursionquota == NULL);
                INSIST(!ISC_QLINK_LINKED(client, ilink));
 
+               if (manager != NULL) {
+                       LOCK(&manager->listlock);
+                       ISC_LIST_UNLINK(manager->clients, client, link);
+                       LOCK(&manager->lock);
+                       if (manager->exiting &&
+                           ISC_LIST_EMPTY(manager->clients))
+                               destroy_manager = ISC_TRUE;
+                       UNLOCK(&manager->lock);
+                       UNLOCK(&manager->listlock);
+               }
+
                ns_query_free(client);
                isc_mem_put(client->mctx, client->recvbuf, RECV_BUFFER_SIZE);
                isc_event_free((isc_event_t **)&client->sendevent);
@@ -575,16 +586,6 @@ exit_check(ns_client_t *client) {
                }
 
                dns_message_destroy(&client->message);
-               if (manager != NULL) {
-                       LOCK(&manager->listlock);
-                       ISC_LIST_UNLINK(manager->clients, client, link);
-                       LOCK(&manager->lock);
-                       if (manager->exiting &&
-                           ISC_LIST_EMPTY(manager->clients))
-                               destroy_manager = ISC_TRUE;
-                       UNLOCK(&manager->lock);
-                       UNLOCK(&manager->listlock);
-               }
 
                /*
                 * Detaching the task must be done after unlinking from
@@ -605,6 +606,13 @@ exit_check(ns_client_t *client) {
                        isc_mem_stats(client->mctx, stderr);
                        INSIST(0);
                }
+
+               /*
+                * Destroy the fetchlock mutex that was created in
+                * ns_query_init().
+                */
+               DESTROYLOCK(&client->query.fetchlock);
+
                isc_mem_putanddetach(&client->mctx, client, sizeof(*client));
        }
 
index b592f742e9a58652e41f39c7268984758c04d1f3..cc9d7c4cc3312321e5774de3ae01a87b973af4cc 100644 (file)
@@ -632,6 +632,10 @@ ns_query_init(ns_client_t *client) {
        client->query.timerset = ISC_FALSE;
        client->query.rpz_st = NULL;
        client->query.qname = NULL;
+       /*
+        * This mutex is destroyed when the client is destroyed in
+        * exit_check().
+        */
        result = isc_mutex_init(&client->query.fetchlock);
        if (result != ISC_R_SUCCESS)
                return (result);
@@ -652,8 +656,10 @@ ns_query_init(ns_client_t *client) {
                return (result);
        }
        result = query_newnamebuf(client);
-       if (result != ISC_R_SUCCESS)
+       if (result != ISC_R_SUCCESS) {
                query_freefreeversions(client, ISC_TRUE);
+               DESTROYLOCK(&client->query.fetchlock);
+       }
 
        return (result);
 }