]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: listener: fix resume_listener() resume return value handling
authorAurelien DARRAGON <adarragon@haproxy.com>
Tue, 7 Feb 2023 12:26:14 +0000 (13:26 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 23 Feb 2023 14:05:05 +0000 (15:05 +0100)
In resume_listener(), proto->resume() errors were not properly handled:
the function kept flowing down as if no errors were detected.

Instead, we're performing an early return when such errors are detected to
prevent undefined behaviors.

This could be backported up to 2.4.

--
Backport notes:

This commit depends on:
 - "MINOR: listener: make sure we don't pause/resume bypassed listeners"

-> 2.4 ... 2.7:

Replace this:

    |        if (l->bind_conf->maxconn && l->nbconn >= l->bind_conf->maxconn) {
    |                l->rx.proto->disable(l);

By this:

    |        if (l->maxconn && l->nbconn >= l->maxconn) {
    |                l->rx.proto->disable(l);

src/listener.c

index 22b3b91685908a4d6a1bd56a0c5d93f21a0a18ee..82c8631791c024716d8e5d0e51da6b1634991633 100644 (file)
@@ -554,8 +554,11 @@ int resume_listener(struct listener *l, int lpx, int lli)
        if (!(l->flags & LI_F_FINALIZED) || l->state == LI_READY)
                goto end;
 
-       if (l->rx.proto->resume)
+       if (l->rx.proto->resume) {
                ret = l->rx.proto->resume(l);
+               if (!ret)
+                       goto end; /* failure to resume */
+       }
 
        if (l->bind_conf->maxconn && l->nbconn >= l->bind_conf->maxconn) {
                l->rx.proto->disable(l);