]> 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:43:52 +0000 (17:43 +1100)
                        manager after accert. [RT #33084]
(cherry picked from commit a8572209bc671e7b36309c50d732dbad08fa8b53)

CHANGES
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index abf2fe8c93507748548b40765577640f41e3f4ed..f77bcc1fd46c10b567e50ce8a6529882d8930f20 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3543.  [bug]           Update socket stucture before attaching to socket
+                       manager after accert. [RT #33084]
+
 3541.  [bug]           The parts if libdns was not being properly initialized
                        in when built in libexport mode. [RT #33028]
 
index 2b7879a28689e32e50fb01b3efff0ca882554f59..d007598e19d095107f52ac479f56b7d792e587c9 100644 (file)
@@ -3215,14 +3215,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;
@@ -3237,6 +3229,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;
@@ -3247,6 +3246,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]);