From 37cfebcaeeabd077c714af5cf6684624ef8a31a2 Mon Sep 17 00:00:00 2001 From: Mukund Sivaraman Date: Tue, 5 Aug 2014 16:58:23 +0530 Subject: [PATCH] [36720] Free event early (fixes race to free) Patch contributed by yhu2 . (cherry picked from commit a338c2d94781f676283f1b110f7802c71e2015bd) --- CHANGES | 2 ++ lib/dns/view.c | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index ff34b19df4..3e5718d9a6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +3910. [bug] Fix races to free event during shutdown. [RT#36720] + 3909. [bug] When computing the number of elements required for a acl count_acl_elements could have a short count leading to a assertion failure. Also zero out new acl elements diff --git a/lib/dns/view.c b/lib/dns/view.c index 7c92e6a515..5f1d7e97d7 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -624,6 +624,8 @@ resolver_shutdown(isc_task_t *task, isc_event_t *event) { UNUSED(task); + isc_event_free(&event); + LOCK(&view->lock); view->attributes |= DNS_VIEWATTR_RESSHUTDOWN; @@ -631,8 +633,6 @@ resolver_shutdown(isc_task_t *task, isc_event_t *event) { UNLOCK(&view->lock); - isc_event_free(&event); - if (done) destroy(view); } @@ -648,6 +648,8 @@ adb_shutdown(isc_task_t *task, isc_event_t *event) { UNUSED(task); + isc_event_free(&event); + LOCK(&view->lock); view->attributes |= DNS_VIEWATTR_ADBSHUTDOWN; @@ -655,8 +657,6 @@ adb_shutdown(isc_task_t *task, isc_event_t *event) { UNLOCK(&view->lock); - isc_event_free(&event); - if (done) destroy(view); } @@ -672,6 +672,8 @@ req_shutdown(isc_task_t *task, isc_event_t *event) { UNUSED(task); + isc_event_free(&event); + LOCK(&view->lock); view->attributes |= DNS_VIEWATTR_REQSHUTDOWN; @@ -679,8 +681,6 @@ req_shutdown(isc_task_t *task, isc_event_t *event) { UNLOCK(&view->lock); - isc_event_free(&event); - if (done) destroy(view); }