mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
BUG/MAJOR: ring: tcp forward on ring can break the reader counter.
If the session is not established, the applet handler could leave with the applet detached from the ring. At next call, the attach counter will be decreased again causing unpredectable behavior. This patch should be backported on branches >=2.2
This commit is contained in:
parent
fd1831499e
commit
fdabf49548
28
src/sink.c
28
src/sink.c
@ -348,18 +348,18 @@ static void sink_forward_io_handler(struct appctx *appctx)
|
|||||||
ofs += ring->ofs;
|
ofs += ring->ofs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we were already there, adjust the offset to be relative to
|
|
||||||
* the buffer's head and remove us from the counter.
|
|
||||||
*/
|
|
||||||
ofs -= ring->ofs;
|
|
||||||
BUG_ON(ofs >= buf->size);
|
|
||||||
HA_ATOMIC_SUB(b_peek(buf, ofs), 1);
|
|
||||||
|
|
||||||
/* in this loop, ofs always points to the counter byte that precedes
|
/* in this loop, ofs always points to the counter byte that precedes
|
||||||
* the message so that we can take our reference there if we have to
|
* the message so that we can take our reference there if we have to
|
||||||
* stop before the end (ret=0).
|
* stop before the end (ret=0).
|
||||||
*/
|
*/
|
||||||
if (si_opposite(si)->state == SI_ST_EST) {
|
if (si_opposite(si)->state == SI_ST_EST) {
|
||||||
|
/* we were already there, adjust the offset to be relative to
|
||||||
|
* the buffer's head and remove us from the counter.
|
||||||
|
*/
|
||||||
|
ofs -= ring->ofs;
|
||||||
|
BUG_ON(ofs >= buf->size);
|
||||||
|
HA_ATOMIC_SUB(b_peek(buf, ofs), 1);
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
while (ofs + 1 < b_data(buf)) {
|
while (ofs + 1 < b_data(buf)) {
|
||||||
cnt = 1;
|
cnt = 1;
|
||||||
@ -488,18 +488,18 @@ static void sink_forward_oc_io_handler(struct appctx *appctx)
|
|||||||
ofs += ring->ofs;
|
ofs += ring->ofs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we were already there, adjust the offset to be relative to
|
|
||||||
* the buffer's head and remove us from the counter.
|
|
||||||
*/
|
|
||||||
ofs -= ring->ofs;
|
|
||||||
BUG_ON(ofs >= buf->size);
|
|
||||||
HA_ATOMIC_SUB(b_peek(buf, ofs), 1);
|
|
||||||
|
|
||||||
/* in this loop, ofs always points to the counter byte that precedes
|
/* in this loop, ofs always points to the counter byte that precedes
|
||||||
* the message so that we can take our reference there if we have to
|
* the message so that we can take our reference there if we have to
|
||||||
* stop before the end (ret=0).
|
* stop before the end (ret=0).
|
||||||
*/
|
*/
|
||||||
if (si_opposite(si)->state == SI_ST_EST) {
|
if (si_opposite(si)->state == SI_ST_EST) {
|
||||||
|
/* we were already there, adjust the offset to be relative to
|
||||||
|
* the buffer's head and remove us from the counter.
|
||||||
|
*/
|
||||||
|
ofs -= ring->ofs;
|
||||||
|
BUG_ON(ofs >= buf->size);
|
||||||
|
HA_ATOMIC_SUB(b_peek(buf, ofs), 1);
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
while (ofs + 1 < b_data(buf)) {
|
while (ofs + 1 < b_data(buf)) {
|
||||||
cnt = 1;
|
cnt = 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user