Le 11/04/2018 à 16:11, Hessam Mirsadeghi a écrit :
Hi Christopher,

You're right; that segfault happens with the build at the faulty commit and not later versions such as v1.8.5. However, version v1.8.5 does segfault with the attached modified Lua script. As far as I can tell, the problem arises after any call to "txn.res:set()".

In the attached Lua script, if you remove the call to either of "txn.res:set(txn.res:get())" or "txn.res:forward(txn.res:get_in_len())", the segfault will disappear. Also, when I only have a call to "txn.res:set(txn.res:get())" in the script, haproxy becomes unresponsive to all but the first request on each persistent connection. That is, something like "curl -sig localhost:80 localhost:80" will only get the response for the first request; the second one times out on the existing connection and succeeds only on a a second connection established by curl.

So, with this script, I have a segfault. But not only with HAProxy 1.8 and higher. It also crashes on HAProxy 1.7. Actually, It will crash on all versions. This is a Lua problem not a HTTP one.

IMHO, "Channel.set" or "Channel.get" must never be used on HTTP messages. These functions totally hijack the HTTP parser. There is an attempt to restore the HTTP parser state. But this is only partially done (the headers' analysis is done, but not all of the ensuing analysis). So the result is undefined. It will seem to work for simpler cases but will fail most of time. Same remarks are true for "Channel.getline" and "Channel.append".

"Channel.forward" (and "Channel.send") must also never be used on HTTP messages. When called, the messages analysis is in progress. The HTTP parser expects to have all the headers at this stage. Mixing message analysis and data forward is totally unexpected.

I will let Thierry (the Lua maintainer) decide what to do. But, I guess he will restrict usage of all these functions to TCP streams only.

So now, maybe you can describe what you try to do. There is probably another way to achieve it. I hope so, because it will never work this way.

Christopher Faulet

Reply via email to