mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Fix lock dependency cycle in rpz zone config setup.
This commit is contained in:
parent
7d4445c03d
commit
b7b5952c3a
2 changed files with 18 additions and 1 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
17 July 2020: Wouter
|
17 July 2020: Wouter
|
||||||
- Fix libnettle compile for session ticket key callback function
|
- Fix libnettle compile for session ticket key callback function
|
||||||
changes.
|
changes.
|
||||||
|
- Fix lock dependency cycle in rpz zone config setup.
|
||||||
|
|
||||||
17 July 2020: Ralph
|
17 July 2020: Ralph
|
||||||
- Merge PR #234 - Ensure proper alignment of cmsg buffers by Jérémie
|
- Merge PR #234 - Ensure proper alignment of cmsg buffers by Jérémie
|
||||||
|
|
|
||||||
|
|
@ -1866,15 +1866,26 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
|
||||||
struct auth_xfer* x = NULL;
|
struct auth_xfer* x = NULL;
|
||||||
|
|
||||||
/* create zone */
|
/* create zone */
|
||||||
|
if(c->isrpz) {
|
||||||
|
/* if the rpz lock is needed, grab it before the other
|
||||||
|
* locks to avoid a lock dependency cycle */
|
||||||
|
lock_rw_wrlock(&az->rpz_lock);
|
||||||
|
}
|
||||||
lock_rw_wrlock(&az->lock);
|
lock_rw_wrlock(&az->lock);
|
||||||
if(!(z=auth_zones_find_or_add_zone(az, c->name))) {
|
if(!(z=auth_zones_find_or_add_zone(az, c->name))) {
|
||||||
lock_rw_unlock(&az->lock);
|
lock_rw_unlock(&az->lock);
|
||||||
|
if(c->isrpz) {
|
||||||
|
lock_rw_unlock(&az->rpz_lock);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(c->masters || c->urls) {
|
if(c->masters || c->urls) {
|
||||||
if(!(x=auth_zones_find_or_add_xfer(az, z))) {
|
if(!(x=auth_zones_find_or_add_xfer(az, z))) {
|
||||||
lock_rw_unlock(&az->lock);
|
lock_rw_unlock(&az->lock);
|
||||||
lock_rw_unlock(&z->lock);
|
lock_rw_unlock(&z->lock);
|
||||||
|
if(c->isrpz) {
|
||||||
|
lock_rw_unlock(&az->rpz_lock);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1889,6 +1900,9 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
|
||||||
lock_basic_unlock(&x->lock);
|
lock_basic_unlock(&x->lock);
|
||||||
}
|
}
|
||||||
lock_rw_unlock(&z->lock);
|
lock_rw_unlock(&z->lock);
|
||||||
|
if(c->isrpz) {
|
||||||
|
lock_rw_unlock(&az->rpz_lock);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
z->for_downstream = c->for_downstream;
|
z->for_downstream = c->for_downstream;
|
||||||
|
|
@ -1900,11 +1914,13 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lock_protect(&z->lock, &z->rpz->local_zones, sizeof(*z->rpz));
|
lock_protect(&z->lock, &z->rpz->local_zones, sizeof(*z->rpz));
|
||||||
lock_rw_wrlock(&az->rpz_lock);
|
/* the az->rpz_lock is locked above */
|
||||||
z->rpz_az_next = az->rpz_first;
|
z->rpz_az_next = az->rpz_first;
|
||||||
if(az->rpz_first)
|
if(az->rpz_first)
|
||||||
az->rpz_first->rpz_az_prev = z;
|
az->rpz_first->rpz_az_prev = z;
|
||||||
az->rpz_first = z;
|
az->rpz_first = z;
|
||||||
|
}
|
||||||
|
if(c->isrpz) {
|
||||||
lock_rw_unlock(&az->rpz_lock);
|
lock_rw_unlock(&az->rpz_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue