From: Mark Andrews Date: Wed, 3 Apr 2013 06:42:42 +0000 (+1100) Subject: 3543. [bug] Update socket stucture before attaching to socket X-Git-Tag: v9.10.0a1~448^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c15b536ddbea458a7a3975079276bf4a9b1617aa;p=thirdparty%2Fbind9.git 3543. [bug] Update socket stucture before attaching to socket manager after accert. [RT #33084] --- diff --git a/CHANGES b/CHANGES index 2681802960c..c8fe8471b81 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3543. [bug] Update socket stucture before attaching to socket + manager after accert. [RT #33084] + 3542. [placeholder] 3541. [bug] The parts if libdns was not being properly initialized diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index b7b62e5c2b4..9ad64c6d59a 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -3468,14 +3468,6 @@ internal_accept(isc_task_t *me, isc_event_t *ev) { if (fd != -1) { int lockid = FDLOCK_ID(fd); - LOCK(&manager->fdlock[lockid]); - manager->fds[fd] = NEWCONNSOCK(dev); - manager->fdstate[fd] = MANAGED; - UNLOCK(&manager->fdlock[lockid]); - - LOCK(&manager->lock); - ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link); - NEWCONNSOCK(dev)->fd = fd; NEWCONNSOCK(dev)->bound = 1; NEWCONNSOCK(dev)->connected = 1; @@ -3496,6 +3488,13 @@ internal_accept(isc_task_t *me, isc_event_t *ev) { */ dev->address = NEWCONNSOCK(dev)->peer_address; + LOCK(&manager->fdlock[lockid]); + manager->fds[fd] = NEWCONNSOCK(dev); + manager->fdstate[fd] = MANAGED; + UNLOCK(&manager->fdlock[lockid]); + + LOCK(&manager->lock); + #ifdef USE_SELECT if (manager->maxfd < fd) manager->maxfd = fd; @@ -3506,6 +3505,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) { "accepted connection, new socket %p", dev->newsocket); + ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link); + UNLOCK(&manager->lock); inc_stats(manager->stats, sock->statsindex[STATID_ACCEPT]);