BUG/MAJOR: http: call manage_client_side_cookies() before erasing the buffer
authorWilly Tarreau <w@1wt.eu>
Sun, 11 Jun 2017 15:56:27 +0000 (17:56 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 11 Jun 2017 16:08:18 +0000 (18:08 +0200)
commit6a0bca9e7862984b0edf8fc1e1edc54295a7a5e2
tree3077a466afad70ef6932a1386ce4278a7303c45d
parentbd6989152f977764f8bafe09e7a0265620da2919
BUG/MAJOR: http: call manage_client_side_cookies() before erasing the buffer

Jean Lubatti reported a crash on haproxy using a config involving cookies
and tarpit rules. It just happens that since 1.7-dev3 with commit 83a2c3d
("BUG/MINOR : allow to log cookie for tarpit and denied request"), function
manage_client_side_cookies() was called after erasing the request buffer in
case of a tarpit action. The problem is that this function must absolutely
not be called with an empty buffer since it moves parts of it. A typical
reproducer consists in sending :

    "GET / HTTP/1.1\r\nCookie: S=1\r\n\r\n"

On such a config :

    listen crash
        bind :8001
        mode http
        reqitarpit .
        cookie S insert indirect
        server s1 127.0.0.1:8000 cookie 1

The fix simply consists in moving the call to the function before the call
to buffer_erase().

Many thanks to Jean for testing instrumented code and providing a usable
core.

This fix must be backported to all stable versions since the fix introducing
this bug was backported as well.
src/proto_http.c