2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 14:07:59 +00:00

[master] dispatch.c race

3695.	[bug]		Address a possible race in dispatch.c. [RT #35107]
This commit is contained in:
Evan Hunt
2013-12-23 09:50:18 -08:00
parent 9c61ab2c99
commit 2b258a1f5b
2 changed files with 9 additions and 7 deletions

View File

@@ -1,3 +1,5 @@
3695. [bug] Address a possible race in dispatch.c. [RT #35107]
3694. [bug] Warn when a key-directory is configured for a zone, 3694. [bug] Warn when a key-directory is configured for a zone,
but does not exist or is not a directory. [RT #35108] but does not exist or is not a directory. [RT #35108]

View File

@@ -683,8 +683,8 @@ destroy_disp_ok(dns_dispatch_t *disp)
/* /*
* Called when refcount reaches 0 (and safe to destroy). * Called when refcount reaches 0 (and safe to destroy).
* *
* The dispatcher must not be locked. * The dispatcher must be locked.
* The manager must be locked. * The manager must not be locked.
*/ */
static void static void
destroy_disp(isc_task_t *task, isc_event_t *event) { destroy_disp(isc_task_t *task, isc_event_t *event) {
@@ -809,6 +809,7 @@ socket_search(dns_qid_t *qid, isc_sockaddr_t *dest, in_port_t port,
{ {
dispsocket_t *dispsock; dispsocket_t *dispsock;
REQUIRE(VALID_QID(qid));
REQUIRE(bucket < qid->qid_nbuckets); REQUIRE(bucket < qid->qid_nbuckets);
dispsock = ISC_LIST_HEAD(qid->sock_table[bucket]); dispsock = ISC_LIST_HEAD(qid->sock_table[bucket]);
@@ -1045,6 +1046,7 @@ entry_search(dns_qid_t *qid, isc_sockaddr_t *dest, dns_messageid_t id,
{ {
dns_dispentry_t *res; dns_dispentry_t *res;
REQUIRE(VALID_QID(qid));
REQUIRE(bucket < qid->qid_nbuckets); REQUIRE(bucket < qid->qid_nbuckets);
res = ISC_LIST_HEAD(qid->qid_table[bucket]); res = ISC_LIST_HEAD(qid->qid_table[bucket]);
@@ -2607,8 +2609,7 @@ dispatch_allocate(dns_dispatchmgr_t *mgr, unsigned int maxrequests,
* MUST be unlocked, and not used by anything. * MUST be unlocked, and not used by anything.
*/ */
static void static void
dispatch_free(dns_dispatch_t **dispp) dispatch_free(dns_dispatch_t **dispp) {
{
dns_dispatch_t *disp; dns_dispatch_t *disp;
dns_dispatchmgr_t *mgr; dns_dispatchmgr_t *mgr;
int i; int i;
@@ -3271,16 +3272,15 @@ dns_dispatch_addresponse2(dns_dispatch_t *disp, isc_sockaddr_t *dest,
*/ */
LOCK(&qid->lock); LOCK(&qid->lock);
id = (dns_messageid_t)dispatch_random(DISP_ARC4CTX(disp)); id = (dns_messageid_t)dispatch_random(DISP_ARC4CTX(disp));
bucket = dns_hash(qid, dest, id, localport);
ok = ISC_FALSE; ok = ISC_FALSE;
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
bucket = dns_hash(qid, dest, id, localport);
if (entry_search(qid, dest, id, localport, bucket) == NULL) { if (entry_search(qid, dest, id, localport, bucket) == NULL) {
ok = ISC_TRUE; ok = ISC_TRUE;
break; break;
} }
id += qid->qid_increment; id += qid->qid_increment;
id &= 0x0000ffff; id &= 0x0000ffff;
bucket = dns_hash(qid, dest, id, localport);
} }
UNLOCK(&qid->lock); UNLOCK(&qid->lock);
@@ -3291,9 +3291,9 @@ dns_dispatch_addresponse2(dns_dispatch_t *disp, isc_sockaddr_t *dest,
res = isc_mempool_get(disp->mgr->rpool); res = isc_mempool_get(disp->mgr->rpool);
if (res == NULL) { if (res == NULL) {
UNLOCK(&disp->lock);
if (dispsocket != NULL) if (dispsocket != NULL)
destroy_dispsocket(disp, &dispsocket); destroy_dispsocket(disp, &dispsocket);
UNLOCK(&disp->lock);
return (ISC_R_NOMEMORY); return (ISC_R_NOMEMORY);
} }