As mentionned in the FastCGI specification, FCGI "streams" are series of
non-empty stream records (length != 0), followed by an empty one. It is properly
handled for FCGI_STDOUT records, but not for FCGI_STDERR ones. If an empty
FCGI_STDERR record is received, the connection is blocked waiting for data which
will never come.
To fix the bug, when an empty FCGI_STDERR record is received, we drop it, eating
the padding if any.
This patch should fix the issue #743. It must be backported as far as 2.1.
(cherry picked from commit
7f85433a912529c5cda1629001b34fd2b2e54758)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit
bd6dc07038f4c6b552559ccde41d31ff9a7dbf6d)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
dbuf = &fconn->dbuf;
/* Only padding remains */
- if (fconn->state == FCGI_CS_RECORD_P)
+ if (fconn->state == FCGI_CS_RECORD_P || !fconn->drl)
goto end_transfer;
if (b_data(dbuf) < (fconn->drl + fconn->drp) &&