Hi Willy, Your previous email didn't contain a patch to disable regexec().
I can confirm that the crash still consistently occurs with the minimal config you suggested. Cheers Will On 1 Jan 2014, at 12:44, Willy Tarreau <[email protected]> wrote: > Hi William, > > On Wed, Jan 01, 2014 at 12:16:29PM +0000, William Lewis wrote: >> Hi Willy, >> >> I can reproduce this on every request that contains a header that matches >> the regex of the rspidel rule. > > Cool, hopefully we'll finally manage to sort it out then. > >> This is the output of the debug logging in the patch you sent. >> >> 0: cur_next=+17 used=16 buf.p=0x7fd1c18eb414 buf.size=16384 buf.p=+0 buf.o=0 >> buf.i=7450 >> 1: old_idx=0 cur_idx=1 ptr=0x7fd1c18eb425 end=+27 next=+29 buf_end=+7433 >> 1: old_idx=1 cur_idx=3 ptr=0x7fd1c18eb442 end=+38 next=+40 buf_end=+7404 >> 1: old_idx=3 cur_idx=4 ptr=0x7fd1c18eb46a end=+55 next=+57 buf_end=+7364 >> 2: old_idx=3 cur_idx=4 next_idx=5 used=16 delta=-57 ptr=0x7fd1c18eb46a >> next=+0 buf_end=+7307 >> 1: old_idx=3 cur_idx=5 ptr=0x7fd1c18eb46a end=+27 next=+29 buf_end=+7307 >> 1: old_idx=5 cur_idx=6 ptr=0x7fd1c18eb487 end=+23 next=+25 buf_end=+7278 >> 1: old_idx=6 cur_idx=7 ptr=0x7fd1c18eb4a0 end=+23 next=+25 buf_end=+7253 >> 1: old_idx=7 cur_idx=8 ptr=0x7fd1c18eb4b9 end=+16 next=+18 buf_end=+7228 >> 1: old_idx=8 cur_idx=9 ptr=0x7fd1c18eb4cb end=+39 next=+41 buf_end=+7210 >> 1: old_idx=9 cur_idx=10 ptr=0x7fd1c18eb4f4 end=+136 next=+138 buf_end=+7169 >> 1: old_idx=10 cur_idx=11 ptr=0x7fd1c18eb57e end=+57 next=+59 buf_end=+7031 >> 1: old_idx=11 cur_idx=12 ptr=0x7fd1c18eb5b9 end=+119 next=+121 buf_end=+6972 >> 1: old_idx=12 cur_idx=13 ptr=0x7fd1c18eb632 end=+28 next=+30 buf_end=+6851 >> 1: old_idx=13 cur_idx=15 ptr=0x7fd1c18eb650 end=+24 next=+26 buf_end=+6821 >> 1: old_idx=15 cur_idx=16 ptr=0x7fd1c18eb66a end=+26 next=+28 buf_end=+6795 >> 1: old_idx=16 cur_idx=17 ptr=0x7fd1c18eb686 end=+22 next=+24 buf_end=+6767 > > So... this shows me that it worked pretty well :-/ > >> And his is the output of "bt full" from gdb against a core dump from the >> patched build >> >> >> #0 0x000000010cbdef40 in conn_free (conn=0x7fd1c1451d80) at connection.h:520 >> 520 pool_free2(pool2_connection, conn); >> (gdb) bt full >> #0 0x000000010cbdef40 in conn_free (conn=0x7fd1c1451d80) at connection.h:520 >> No locals. >> #1 0x000000010cbcf132 in si_release_endpoint (si=0x7fd1c1451b08) at >> stream_interface.h:126 >> conn = (struct connection *) 0x7fd1c1451d80 >> appctx = (struct appctx *) 0x10cbc1113 >> >> #2 0x000000010cbceb02 in http_end_txn_clean_session (s=0x7fd1c1451880) at >> src/proto_http.c:4377 >> No locals. >> #3 0x000000010cbcfe48 in http_resync_states (s=0x7fd1c1451880) at >> src/proto_http.c:4766 >> txn = (struct http_txn *) 0x7fd1c14518c8 >> old_req_state = 33 >> old_res_state = 33 >> #4 0x000000010cbd611e in http_response_forward_body (s=0x7fd1c1451880, >> res=0x7fd1c144fce0, an_bit=1048576) at src/proto_http.c:6082 >> tmpbuf = (struct buffer *) 0x7fd1c18eb400 > > This one correctly matches the buffer above. > > (...) > > There are two things that could be attempted now : > > - try the attached patch to disable regexec() and inconditionally > perform the action. If it still crashes, then we can rule out > any libpcre bug. > > - try to eliminate some unneeded options in the config below to > find the minimal set required to crash. Ideally, I'd go with > the very minimalistic config below : > > global > daemon > > listen external > bind :80 > mode http > maxconn 1024 > timeout connect 6000 > timeout client 1020000 > timeout server 1020000 > timeout http-request 6000 > option http-server-close > rspidel ^X-Frame-Options:.* > server migw :8081 > > If this does not crash with the config above, please try to disable some > of the settings marked "<<<<< this one" below : > >> global >> daemon >> quiet >> maxconn 1024 >> pidfile haproxy.pid >> log 127.0.0.1 local0 <<<<<< this one >> log 127.0.0.1 local1 notice <<<<<< this one >> >> defaults >> log global <<<<<< this one >> >> balance roundrobin <<<<<< this one >> mode http >> http-check send-state <<<<<< this one >> >> retries 3 >> >> timeout connect 6000 >> timeout client 1020000 >> timeout server 1020000 >> timeout http-request 6000 >> >> option abortonclose <<<<<< this one >> option forwardfor except 127.0.0.1 <<<<<< this one >> option http-pretend-keepalive <<<<<< this one >> option http-server-close >> option httplog <<<<<< this one >> option log-health-checks <<<<<< this one >> option log-separate-errors <<<<<< this one >> option redispatch <<<<<< this one >> option tcpka <<<<<< this one >> >> errorfile 200 errorfiles/200.http <<<<<< this one >> errorfile 400 errorfiles/400.http <<<<<< this one >> errorfile 403 errorfiles/403.http <<<<<< this one >> errorfile 408 errorfiles/408.http <<<<<< this one >> errorfile 500 errorfiles/500.http <<<<<< this one >> errorfile 502 errorfiles/502.http <<<<<< this one >> errorfile 503 errorfiles/503.http <<<<<< this one >> >> >> listen stats :7000 >> mode http >> stats uri / >> >> frontend external >> bind :80 >> >> maxconn 1024 >> >> rspidel ^X-Frame-Options:.* >> >> default_backend migw >> >> backend migw >> option httpchk GET /online <<<<<< this one >> server migw :8081 check port 48080 > > Thanks, > Willy >

