]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3543. [bug] Update socket stucture before attaching to socket
authorMark Andrews <marka@isc.org>
Wed, 3 Apr 2013 06:42:42 +0000 (17:42 +1100)
committerMark Andrews <marka@isc.org>
Wed, 3 Apr 2013 06:42:42 +0000 (17:42 +1100)
                        manager after accert. [RT #33084]

CHANGES
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index 2681802960c6286588cc66a58d62e2d293c480a3..c8fe8471b81da9415cf36ee842842119602ede67 100644 (file)
--- 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
index b7b62e5c2b4707d32af1e997f1909a35db2fcf83..9ad64c6d59a7ad055085c4e28c02bbd0f87b8a68 100644 (file)
@@ -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]);