haproxy/src
Willy Tarreau e6ca435c04 BUG/MEDIUM: poller: use fd_delete() to release the poller pipes
The poller pipes needed to communicate between multiple threads are
allocated in init_pollers_per_thread() and released in
deinit_pollers_per_thread(). The former adds them via fd_insert()
so that they are known, but the former only closes them using a
regular close().

This asymmetry represents a problem, because we have in the fdtab[]
an entry for something that may disappear when one thread leaves, and
since these FD numbers are very low, there is a very high likelihood
that they are immediately reassigned to another thread trying to
connect() to a server or just sending a health check. In this case,
the other thread is going to fd_insert() the fd and the recently
added consistency checks will notive that ->owner is not NULL and
will crash. We just need to use fd_delete() here to match fd_insert().

Note that this test was added in 2.7-dev2 by commit 36d9097cf
("MINOR: fd: Add BUG_ON checks on fd_insert()") which was backported
to 2.4 as a safety measure (since it allowed to catch particularly
serious issues). The patch in itself isn't wrong, it just revealed
a long-dormant bug (been there since 1.9-dev1, 4 years ago). As such
the current patch needs to be backported wherever the commit above
is backported.

Many thanks to Christian Ruppert for providing detailed traces in
github issue #1807 and Cedric Paillet for bringing his complementary
analysis that helped to understand the required conditions for this
issue to happen (fast health checks @100ms + randomly long connections
~7s + fast reloads every second + hard-stop-after 5s were necessary
on the dev's machine to trigger it from time to time).
2022-08-10 17:25:23 +02:00
..
acl.c MINOR: acl: alphanumerically sort the ACL dump 2022-03-30 11:49:59 +02:00
action.c BUG/MINOR: rules: Fix check_capture() function to use the right rule arguments 2022-04-25 15:28:21 +02:00
activity.c MINOR: thread: only use atomic ops to touch the flags 2022-07-01 19:15:14 +02:00
applet.c MINOR: applet: always use task_new_on() on applet creation 2022-07-01 19:15:14 +02:00
arg.c
auth.c
backend.c BUG/MINOR: backend: Don't increment conn_retries counter too early 2022-08-03 11:16:35 +02:00
base64.c
cache.c CLEANUP: applet: rename appctx_cs() to appctx_sc() 2022-05-27 19:33:35 +02:00
calltrace.c BUILD: calltrace: fix wrong include when building with TRACE=1 2022-04-19 08:23:30 +02:00
cbuf.c CLEANUP: pool/tree-wide: remove suffix "_pool" from certain pool names 2022-06-23 11:49:09 +02:00
cfgcond.c
cfgdiag.c
cfgparse-global.c MEDIUM: cpu-map: replace the process number with the thread group number 2022-07-15 19:43:10 +02:00
cfgparse-listen.c MEDIUM: config: remove deprecated "bind-process" directives from frontends 2022-07-15 19:41:26 +02:00
cfgparse-quic.c MINOR: quic: New "quic-cc-algo" bind keyword 2022-07-29 17:32:05 +02:00
cfgparse-ssl.c MINOR: listener/ssl: set the SSL xprt layer only once the whole config is known 2022-05-20 18:41:55 +02:00
cfgparse-tcp.c CLEANUP: tree-wide: remove 25 occurrences of unneeded fcntl.h 2022-04-26 10:59:48 +02:00
cfgparse-unix.c CLEANUP: tree-wide: remove 25 occurrences of unneeded fcntl.h 2022-04-26 10:59:48 +02:00
cfgparse.c BUILD: cfgparse: always defined _GNU_SOURCE for sched.h and crypt.h 2022-08-07 16:55:07 +02:00
channel.c CLEANUP: conn_stream: tree-wide rename to stconn (stream connector) 2022-05-27 19:33:34 +02:00
check.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
chunk.c CLEANUP: chunks: release trash also in deinit 2022-04-27 17:55:41 +02:00
cli.c MINOR: cli: warning on _getsocks when socket were closed 2022-07-28 15:49:43 +02:00
clock.c MINOR: clock: use ltid_bit in clock_report_idle() 2022-07-01 19:15:15 +02:00
compression.c CLEANUP: compression: move the default setting of maxzlibmem to defaults 2022-04-25 19:42:43 +02:00
connection.c MINOR: connection: support HTTP/3.0 for smp_*_http_major fetch 2022-06-07 12:04:12 +02:00
cpuset.c MEDIUM: cpu-map: replace the process number with the thread group number 2022-07-15 19:43:10 +02:00
debug.c MINOR: debug/memstats: automatically determine first column size 2022-08-09 08:51:08 +02:00
dgram.c
dict.c
dns.c BUG/MEDIUM: dns: Properly initialize new DNS session 2022-08-03 10:30:07 +02:00
dynbuf.c
eb32sctree.c
eb32tree.c
eb64tree.c
ebimtree.c
ebistree.c
ebmbtree.c
ebpttree.c
ebsttree.c
ebtree.c
errors.c CLEANUP: ring: pass the ring watch flags to ring_attach_cli(), not in ctx.cli 2022-05-06 18:13:36 +02:00
ev_epoll.c BUG/MAJOR: poller: drop FD's tgid when masks don't match 2022-07-25 15:47:15 +02:00
ev_evports.c BUG/MAJOR: poller: drop FD's tgid when masks don't match 2022-07-25 15:47:15 +02:00
ev_kqueue.c BUG/MAJOR: poller: drop FD's tgid when masks don't match 2022-07-25 15:47:15 +02:00
ev_poll.c MEDIUM: fd: make thread_mask now represent group-local IDs 2022-07-15 20:16:30 +02:00
ev_select.c MEDIUM: fd/poller: turn update_mask to group-local IDs 2022-07-15 20:16:30 +02:00
extcheck.c MINOR: task: replace task_set_affinity() with task_set_thread() 2022-07-01 19:15:14 +02:00
fcgi-app.c MEDIUM: http-ana: Add a proxy option to restrict chars in request header names 2022-05-16 16:00:26 +02:00
fcgi.c
fd.c BUG/MEDIUM: poller: use fd_delete() to release the poller pipes 2022-08-10 17:25:23 +02:00
filters.c CLEANUP: tree-wide: Remove any ref to stream-interfaces 2022-04-13 15:10:16 +02:00
fix.c
flt_bwlim.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
flt_http_comp.c BUG/MEDIUM: compression: Don't forget to update htx_sl and http_msg flags 2022-04-15 16:22:33 +02:00
flt_spoe.c CLEANUP: applet: rename appctx_cs() to appctx_sc() 2022-05-27 19:33:35 +02:00
flt_trace.c
freq_ctr.c MINOR: freq_ctr: Add a function to get events excess over the current period 2022-06-22 18:33:27 +02:00
frontend.c REORG: rename cs_utils.h to sc_strm.h 2022-05-27 19:33:35 +02:00
h1_htx.c BUG/MEDIUM: http: Properly reject non-HTTP/1.x protocols 2022-05-24 15:38:05 +02:00
h1.c BUG/MEDIUM: h1: Improve authority validation for CONNCET request 2022-07-07 09:35:58 +02:00
h2.c
h3_stats.c MINOR: h3: Add a statistics module for h3 2022-05-30 09:59:26 +02:00
h3.c MEDIUM: mux-quic: implement http-request timeout 2022-08-03 15:04:18 +02:00
haproxy.c BUG/MEDIUM: master: force the thread count earlier 2022-07-22 17:51:53 +02:00
hash.c
hlua_fcn.c CLEANUP: Add missing header to hlua_fcn.c 2022-05-17 11:40:33 +02:00
hlua.c CLEANUP: task: remove thread_mask from the struct task 2022-07-01 19:15:14 +02:00
hpack-dec.c BUILD/DEBUG: hpack: use unsigned int in printf format in debug code 2022-04-12 08:40:38 +02:00
hpack-enc.c
hpack-huff.c OPTIM: hpack: read 32 bits at once when possible. 2022-04-01 17:29:06 +02:00
hpack-tbl.c BUILD/DEBUG: hpack-tbl: fix format string in standalone debug code 2022-04-12 08:30:08 +02:00
hq_interop.c MEDIUM: mux-quic: implement http-request timeout 2022-08-03 15:04:18 +02:00
http_acl.c
http_act.c BUG/MINOR: http-act: Properly generate 103 responses when several rules are used 2022-07-06 09:37:43 +02:00
http_ana.c BUG/MEDIUM: http-ana: Don't wait to have an empty buf to switch in TUNNEL state 2022-07-08 16:37:31 +02:00
http_client.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
http_conv.c BUG/MEDIUM: http-conv: Fix url_enc() to not crush const samples 2022-04-08 10:12:59 +02:00
http_fetch.c BUILD: http: silence an uninitialized warning affecting gcc-5 2022-07-10 14:13:48 +02:00
http_htx.c MINOR: http-htx: Use new HTTP functions for the scheme based normalization 2022-07-07 09:35:58 +02:00
http_rules.c BUILD: http: remove the two unused constructors in rules and ana 2022-04-25 19:26:26 +02:00
http.c MINOR: http: Add function to detect default port 2022-07-06 17:54:03 +02:00
htx.c
init.c MINOR: init: add the pre-check callback 2022-04-22 15:45:47 +02:00
jwt.c
lb_chash.c
lb_fas.c
lb_fwlc.c
lb_fwrr.c
lb_map.c
listener.c MEDIUM: listener: switch bind_thread from global to group-local 2022-07-15 20:16:30 +02:00
log.c BUG/MINOR: log: Properly test connection retries to fix dontlog-normal option 2022-06-17 14:53:21 +02:00
lru.c BUILD/DEBUG: lru: fix printf format in debug code 2022-04-12 08:19:33 +02:00
mailers.c BUG/MEDIUM: mailers: Set the object type for check attached to an email alert 2022-06-08 15:28:38 +02:00
map.c CLEANUP: applet: rename appctx_cs() to appctx_sc() 2022-05-27 19:33:35 +02:00
mjson.c
mqtt.c MEDIUM: mqtt: support mqtt_is_valid and mqtt_field_value converters for MQTTv3.1 2022-03-22 09:25:52 +01:00
mux_fcgi.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
mux_h1.c BUG/MEDIUM: mux-h1: Handle connection error after a synchronous send 2022-07-08 16:37:31 +02:00
mux_h2.c CLEANUP: h2: Typo fix in h2_unsubcribe() traces 2022-06-30 14:34:32 +02:00
mux_pt.c CLEANUP: mux-pt: rename the "endp" field to "sd" 2022-05-27 19:33:35 +02:00
mux_quic.c BUG/MINOR: mux-quic: open stream on STOP_SENDING 2022-08-09 17:58:02 +02:00
mworker-prog.c
mworker.c BUG/MINOR: mworker: PROC_O_LEAVING used but not updated 2022-07-27 12:13:56 +02:00
namespace.c
ncbuf.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
pattern.c BUG/MEDIUM: pattern: only visit equivalent nodes when skipping versions 2022-08-01 11:59:46 +02:00
payload.c CLEANUP: check: rename all occurrences of stconn "cs" to "sc" 2022-05-27 19:33:35 +02:00
peers.c BUG/MINOR: peers: Use right channel flag to consider the peer as connected 2022-08-03 09:56:38 +02:00
pipe.c
pool.c REORG: stconn: rename conn_stream.{c,h} to stconn.{c,h} 2022-05-27 19:33:35 +02:00
proto_quic.c CLEANUP: pool/tree-wide: remove suffix "_pool" from certain pool names 2022-06-23 11:49:09 +02:00
proto_sockpair.c MINOR: sockpair: move send_fd_uxst() error message in caller 2022-07-25 16:11:11 +02:00
proto_tcp.c MINOR: protocol: replace ctrl_type with xprt_type and clarify it 2022-05-20 18:39:43 +02:00
proto_udp.c MINOR: protocol: replace ctrl_type with xprt_type and clarify it 2022-05-20 18:39:43 +02:00
proto_uxdg.c MINOR: protocol: replace ctrl_type with xprt_type and clarify it 2022-05-20 18:39:43 +02:00
proto_uxst.c MINOR: protocol: replace ctrl_type with xprt_type and clarify it 2022-05-20 18:39:43 +02:00
protocol.c MINOR: protocol: replace ctrl_type with xprt_type and clarify it 2022-05-20 18:39:43 +02:00
proxy.c BUG/MEDIUM: proxy: Perform a custom copy for default server settings 2022-08-03 11:44:34 +02:00
qpack-dec.c MINOR: qpack: properly handle invalid dynamic table references 2022-06-30 11:51:06 +02:00
qpack-enc.c BUG/MINOR: qpack: support bigger prefix-integer encoding 2022-05-30 14:30:05 +02:00
qpack-tbl.c
queue.c BUG/MEDIUM: queue/threads: limit the number of entries dequeued at once 2022-07-30 10:00:59 +02:00
quic_cc_cubic.c BUG/MEDIUM: quic: Floating point exception in cubic_root() 2022-08-03 14:27:20 +02:00
quic_cc_newreno.c MINOR: quic: Congestion control architecture refactoring 2022-07-29 17:32:05 +02:00
quic_cc.c MEDIUM: quic: Cubic congestion control algorithm implementation 2022-07-29 17:32:05 +02:00
quic_frame.c BUILD: quic+h3: 32-bit compilation errors fixes 2022-06-24 12:13:53 +02:00
quic_loss.c MINOR: quic: Stop looking for packet loss asap 2022-07-29 17:32:05 +02:00
quic_sock.c MINOR: quic: Replace pool_zalloc() by pool_malloc() for fake datagrams 2022-08-08 21:10:58 +02:00
quic_stats.c MINOR: quic: Add two new stats counters for sendto() errors 2022-08-05 15:27:14 +02:00
quic_stream.c CLEANUP: quic: drop the name "conn_stream" from the pool variable names 2022-05-27 19:33:35 +02:00
quic_tls.c CLEANUP: quic: Remove any reference to boringssl 2022-06-16 15:58:48 +02:00
quic_tp.c MINOR: quic: Dump version_information transport parameter 2022-06-21 11:07:39 +02:00
raw_sock.c MINOR: tree-wide: always consider EWOULDBLOCK in addition to EAGAIN 2022-04-25 20:32:15 +02:00
regex.c
resolvers.c MEDIUM: resolvers: continue startup if network is unavailable 2022-07-26 10:59:14 +02:00
ring.c BUG/MINOR: ring/cli: fix a race condition between the writer and the reader 2022-08-04 17:00:21 +02:00
sample.c BUG/MEDIUM: sample: Fix adjusting size in word converter 2022-05-27 19:33:34 +02:00
server_state.c
server.c REORG: server: Export srv_settings_cpy() function 2022-08-03 11:28:52 +02:00
session.c
sha1.c
shctx.c
signal.c
sink.c BUG/MINOR: sink: fix a race condition between the writer and the reader 2022-08-04 17:21:16 +02:00
slz.c
sock_inet.c MEDIUM: fd: add the tgid to the fd and pass it to fd_insert() 2022-07-15 19:58:06 +02:00
sock_unix.c MEDIUM: fd: add the tgid to the fd and pass it to fd_insert() 2022-07-15 19:58:06 +02:00
sock.c MINOR: sockpair: move send_fd_uxst() error message in caller 2022-07-25 16:11:11 +02:00
ssl_ckch.c MINOR: ssl: enhance ca-file error emitting 2022-07-19 19:13:08 +02:00
ssl_crtlist.c BUG/MEDIUM: ssl/cli: crash when crt inserted into a crt-list 2022-06-20 17:27:49 +02:00
ssl_sample.c CLEANUP: check: rename all occurrences of stconn "cs" to "sc" 2022-05-27 19:33:35 +02:00
ssl_sock.c BUG/MEDIUM: fix DH length when EC key is used 2022-08-06 17:45:40 +02:00
ssl_utils.c CLEANUP: Add missing header to ssl_utils.c 2022-05-17 11:40:33 +02:00
stats.c BUG/MINOR: cli/stats: add missing trailing LF after "show info json" 2022-06-10 15:12:21 +02:00
stconn.c CLEANUP: assorted typo fixes in the code and comments 2022-08-06 17:12:51 +02:00
stick_table.c CLEANUP: applet: rename appctx_cs() to appctx_sc() 2022-05-27 19:33:35 +02:00
stream.c MEDIUM: fd/poller: turn update_mask to group-local IDs 2022-07-15 20:16:30 +02:00
task.c MINOR: task: move the niced_tasks counter to the thread group context 2022-07-15 19:43:10 +02:00
tcp_act.c REORG: rename cs_utils.h to sc_strm.h 2022-05-27 19:33:35 +02:00
tcp_rules.c BUG/MINOR: tcp-rules: Make action call final on read error and delay expiration 2022-06-13 08:04:10 +02:00
tcp_sample.c CLEANUP: check: rename all occurrences of stconn "cs" to "sc" 2022-05-27 19:33:35 +02:00
tcpcheck.c BUG/MINOR: http-check: Preserve headers if not redefined by an implicit rule 2022-07-06 09:35:13 +02:00
thread.c MINOR: threads: report the number of thread groups in build options 2022-08-06 16:45:26 +02:00
time.c
tools.c DEBUG: tools: provide a tree dump function for ebmbtrees as well 2022-08-01 11:59:15 +02:00
trace.c BUG/MINOR: trace: Test server existence for health-checks to get proxy 2022-06-08 15:28:38 +02:00
uri_auth.c
uri_normalizer.c
vars.c
version.c
wdt.c MINOR: wdt: do not rely on threads_to_dump anymore 2022-07-01 19:26:35 +02:00
xprt_handshake.c CLEANUP: pool/tree-wide: remove suffix "_pool" from certain pool names 2022-06-23 11:49:09 +02:00
xprt_quic.c BUG/MEDIUM: quic: always remove the connection from the accept list on close 2022-08-10 07:30:22 +02:00