BUG: stream_sock: si->release was not called upon shutw()

The ->release function of the stream interface is never called upon
a shutw() because it's placed after a return statement. It is possible
that it has impacted inter-process stick-table replication by preventing
a full resync after certain sequences of connection breakage. Since this
bug has been present since the introduction of the ->release() callback,
it cannot have caused regressions, just possibly non-working situations.

This was detected at Exceliance by Emeric Brun during a code review. It
is 1.5-specific.
This commit is contained in:
Willy Tarreau 2012-03-10 13:42:32 +01:00
parent 62e7c7146e
commit ad4cd58986
1 changed files with 3 additions and 4 deletions

View File

@ -885,16 +885,15 @@ void stream_sock_shutw(struct stream_interface *si)
case SI_ST_QUE: case SI_ST_QUE:
case SI_ST_TAR: case SI_ST_TAR:
si->state = SI_ST_DIS; si->state = SI_ST_DIS;
if (si->release)
si->release(si);
default: default:
si->flags &= ~SI_FL_WAIT_ROOM; si->flags &= ~SI_FL_WAIT_ROOM;
si->ib->flags |= BF_SHUTR; si->ib->flags |= BF_SHUTR;
si->ib->rex = TICK_ETERNITY; si->ib->rex = TICK_ETERNITY;
si->exp = TICK_ETERNITY; si->exp = TICK_ETERNITY;
return;
} }
if (si->release)
si->release(si);
} }
/* /*