mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 15:47:01 +02:00
BUG/MEDIUM: channel: Be aware of SHUTW_NOW flag when output data are peeked
The CF_SHUTW_NOW flag must be handled the same way than the CF_SHUTW flag in co_getblk_nc() and co_getline_nc() functions. It is especally important when we try to peek a line from outgoing data. In this case, an unfinished line is blocked an nothing is peeked if the CF_SHUTW_NOW flag is set. But the blocked data pevent the transition to CF_SHUTW. The above functions are only used by LUA cosockets. Because of this bug, we may experienced wakeups in loop of the cosocket's io handler if we try to read a line on a closed socket with a pending unfinished line (no LF found at the end). This patch should fix issue #744. It must be backported to all supported versions.
This commit is contained in:
parent
2d067f93fb
commit
f706a794d8
@ -259,7 +259,7 @@ int co_getblk(const struct channel *chn, char *blk, int len, int offset)
|
||||
int co_getblk_nc(const struct channel *chn, const char **blk1, size_t *len1, const char **blk2, size_t *len2)
|
||||
{
|
||||
if (unlikely(co_data(chn) == 0)) {
|
||||
if (chn->flags & CF_SHUTW)
|
||||
if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
@ -301,7 +301,7 @@ int co_getline_nc(const struct channel *chn,
|
||||
}
|
||||
}
|
||||
|
||||
if (chn->flags & CF_SHUTW) {
|
||||
if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW)) {
|
||||
/* If we have found no LF and the buffer is shut, then
|
||||
* the resulting string is made of the concatenation of
|
||||
* the pending blocks (1 or 2).
|
||||
|
Loading…
Reference in New Issue
Block a user