]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[BUG] stream_interface: only call si->release when both dirs are closed
authorWilly Tarreau <w@1wt.eu>
Tue, 7 Sep 2010 14:16:50 +0000 (16:16 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 7 Sep 2010 14:16:50 +0000 (16:16 +0200)
si->release() was called each time we closed one direction of a stream
interface, while it should only have been called when both sides are
closed. This bug is specific to 1.5 and only affects embedded tasks.

src/stream_interface.c

index f7f0881690ec5e3d83637e9f9b4c2ac44377c626..2ffca17ba1bd0a276b5bbfe38f8c2d0bbca35287 100644 (file)
@@ -192,10 +192,10 @@ void stream_int_shutr(struct stream_interface *si)
        if (si->ob->flags & BF_SHUTW) {
                si->state = SI_ST_DIS;
                si->exp = TICK_ETERNITY;
-       }
 
-       if (si->release)
-               si->release(si);
+               if (si->release)
+                       si->release(si);
+       }
 
        /* note that if the task exist, it must unregister itself once it runs */
        if (!(si->flags & SI_FL_DONT_WAKE) && si->owner)
@@ -226,6 +226,9 @@ void stream_int_shutw(struct stream_interface *si)
        case SI_ST_CER:
                si->state = SI_ST_DIS;
                /* fall through */
+
+               if (si->release)
+                       si->release(si);
        default:
                si->flags &= ~SI_FL_WAIT_ROOM;
                si->ib->flags |= BF_SHUTR;
@@ -233,9 +236,6 @@ void stream_int_shutw(struct stream_interface *si)
                si->exp = TICK_ETERNITY;
        }
 
-       if (si->release)
-               si->release(si);
-
        /* note that if the task exist, it must unregister itself once it runs */
        if (!(si->flags & SI_FL_DONT_WAKE) && si->owner)
                task_wakeup(si->owner, TASK_WOKEN_IO);