haproxy/src
Willy Tarreau fdf53b4962 BUG/MINOR: pools: don't mark ourselves as harmless in DEBUG_UAF mode
When haproxy is built with DEBUG_UAF=1, some particularly slow
allocation functions are used for each pool, and it was not uncommon
to see the watchdog trigger during performance tests. For this reason
the allocation functions were surrounded by a pair of thread_harmless
calls to mention that the function was waiting in slow syscalls. The
problem is that this also releases functions blocked in thread_isolate()
which can then start their work.

In order to protect against the accidental removal of a shared resource
in this situation, in 2.5-dev4 with commit ba3ab7907 ("MEDIUM: servers:
make the server deletion code run under full thread isolation") was added
thread_isolate_full() for functions which want to be totally protected
due to being manipulating some data.

But this is not sufficient, because there are still places where we
can allocate/free (thus sleep) under a lock, such as in long call
chains involving the release of an idle connection. In this case, if
one thread asks for isolation, one thread might hang in
pool_alloc_area_uaf() with a lock held (for example the conns_lock
when coming from conn_backend_get()->h1_takeover()->task_new()), with
another thread blocked on a lock waiting for that one to release it,
both keeping their bit clear in the thread_harmless mask, preventing
the first thread from being released, thus causing a deadlock.

In addition to this, it was already seen that the "show fd" CLI handler
could wake up during a pool_free_area_uaf() with an incompletely
released memory area while deleting a file descriptor, and be fooled
showing bad pointers, or during a pool_alloc() on another thread that
was in the process of registering a freshly allocated connection to a
new file descriptor.

One solution could consist in replacing all thread_isolate() calls by
thread_isolate_full() but then that makes thread_isolate() useless
and only shifts the problem by one slot.

A better approach could possibly consist in having a way to mark that
a thread is entering an extremely slow section. Such sections would
be timed so that this is not abused, and the bit would be used to
make the watchdog more patient. This would be acceptable as this would
only affect debugging.

The approach used here for now consists in removing the harmless bits
around the UAF allocator, thus essentially undoing commit 85b2cae63
("MINOR: pools: make the thread harmless during the mmap/munmap
syscalls").

This is marked as minor because nobody is expected to be running with
DEBUG_UAF outside of development or serious debugging, so this issue
cannot affect regular users. It must be backported to stable branches
that have thread_harmless_now() around the mmap() call.
2021-11-12 11:17:37 +01:00
..
acl.c MINOR: add ::1 to predefined LOCALHOST acl 2021-10-18 07:21:28 +02:00
action.c CLEANUP: Apply ha_free.cocci 2021-11-05 07:48:38 +01:00
activity.c MINOR: memprof: add one pointer size to the size of allocations 2021-10-22 16:40:09 +02:00
applet.c BUG/MINOR: applet: Notify the other side if data were consumed by an applet 2021-04-28 10:51:08 +02:00
arg.c MINOR: arg: Be able to forbid unresolved args when building an argument list 2021-09-30 16:37:05 +02:00
auth.c BUILD: auth: include missing list.h 2021-05-08 12:29:51 +02:00
backend.c MINOR: backend: Get client dst address to set the server's one only if needful 2021-11-05 15:25:34 +01:00
base64.c BUG/MINOR: base64: base64urldec() ignores padding in output size check 2021-08-25 16:14:14 +02:00
cache.c BUG/MINOR: cache: properly ignore unparsable max-age in quotes 2021-11-08 12:09:27 +01:00
calltrace.c BUILD: trace: include tools.h 2020-09-25 17:54:48 +02:00
cbuf.c MINOR: quic: Make circular buffer internal buffers be variable-sized. 2021-09-23 15:27:25 +02:00
cfgcond.c MINOR: ssl: Add ssllib_name_startswith precondition 2021-10-13 11:28:08 +02:00
cfgdiag.c CLEANUP: assorted typo fixes in the code and comments 2021-04-26 10:42:58 +02:00
cfgparse-global.c MINOR: config: use a standard parser for the "nbthread" keyword 2021-09-27 09:47:40 +02:00
cfgparse-listen.c BUG/MEDIUM: sample: Cumulate frontend and backend sample validity flags 2021-10-15 14:12:19 +02:00
cfgparse-ssl.c BUILD: cfgparse-ssl: add missing errors.h 2021-10-07 01:36:51 +02:00
cfgparse-tcp.c MINOR: server: prepare parsing for dynamic servers 2021-03-18 15:51:12 +01:00
cfgparse-unix.c MINOR: listener: create a new struct "settings" in bind_conf 2020-09-16 20:13:13 +02:00
cfgparse.c MINOR: protocols: replace protocol_by_family() with protocol_lookup() 2021-10-27 17:41:07 +02:00
channel.c CLEANUP: channel: fix comment in ci_putblk. 2021-02-13 09:43:17 +01:00
check.c BUG/MEDIUM: checks: fix the starting thread for external checks 2021-10-20 18:43:30 +02:00
chunk.c MINOR: pool: move pool declarations to read_mostly 2021-04-10 19:27:41 +02:00
cli.c MINOR: mworker: ReloadFailed shown depending on failedreload 2021-11-10 15:53:01 +01:00
clock.c REORG: thread/clock: move the clock parts of thread_info to thread_ctx 2021-10-08 17:22:26 +02:00
compression.c REORG: thread/clock: move the clock parts of thread_info to thread_ctx 2021-10-08 17:22:26 +02:00
connection.c MEDIUM: connection: rename fc_conn_err and bc_conn_err to fc_err and bc_err 2021-11-06 09:20:07 +01:00
cpuset.c BUG/MEDIUM: cpuset: fix cpuset size for FreeBSD 2021-10-15 17:16:11 +02:00
debug.c MINOR: debug: report the group and thread ID in the thread dumps 2021-10-08 17:22:26 +02:00
dgram.c REORG: dgram: rename proto_udp to dgram 2020-06-11 10:18:59 +02:00
dict.c CLEANUP: atomic/tree-wide: replace single increments/decrements with inc/dec 2021-04-07 18:18:37 +02:00
dns.c MINOR: stream: Use backend stream-interface dst address instead of target_addr 2021-10-27 11:35:59 +02:00
dynbuf.c REORG: thread/sched: move the last dynamic thread_info to thread_ctx 2021-10-08 17:22:26 +02:00
eb32sctree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
eb32tree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
eb64tree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
ebimtree.c CLEANUP: include: tree-wide alphabetical sort of include files 2020-06-11 10:18:59 +02:00
ebistree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
ebmbtree.c CLEANUP: assorted typo fixes in the code and comments 2021-08-16 12:37:59 +02:00
ebpttree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
ebsttree.c REORG: ebtree: move the include files from ebtree to include/import/ 2020-06-11 09:31:11 +02:00
ebtree.c BUG/MEDIUM: ebtree: use a byte-per-byte memcmp() to compare memory blocks 2020-06-16 11:30:33 +02:00
errors.c CLEANUP: Apply xalloc_size.cocci 2021-09-17 17:22:05 +02:00
ev_epoll.c MINOR: activity: get the run_time from the clock updates 2021-10-08 17:22:26 +02:00
ev_evports.c CLEANUP: Re-apply xalloc_size.cocci 2021-11-08 08:05:39 +01:00
ev_kqueue.c MINOR: activity: get the run_time from the clock updates 2021-10-08 17:22:26 +02:00
ev_poll.c MINOR: activity: get the run_time from the clock updates 2021-10-08 17:22:26 +02:00
ev_select.c MINOR: activity: get the run_time from the clock updates 2021-10-08 17:22:26 +02:00
extcheck.c MINOR: proxy: Introduce proxy flags to replace disabled bitfield 2021-10-15 14:12:19 +02:00
fcgi-app.c CLEANUP: assorted typo fixes in the code and comments 2021-08-16 12:37:59 +02:00
fcgi.c CLEANUP: include: tree-wide alphabetical sort of include files 2020-06-11 10:18:59 +02:00
fd.c REORG: thread/sched: move the thread_info flags to the thread_ctx 2021-10-08 17:22:26 +02:00
filters.c MINOR: proxy: Introduce proxy flags to replace disabled bitfield 2021-10-15 14:12:19 +02:00
fix.c CLEANUP: assorted typo fixes in the code and comments 2021-08-16 12:37:59 +02:00
flt_http_comp.c MINOR: compression: Warn for 'compression offload' in defaults sections 2021-11-05 16:36:42 +01:00
flt_spoe.c REORG: thread/sched: move the last dynamic thread_info to thread_ctx 2021-10-08 17:22:26 +02:00
flt_trace.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
freq_ctr.c CLEANUP: tree-wide: remove unneeded include time.h in ~20 files 2021-10-07 01:41:14 +02:00
frontend.c MINOR: frontend: Rely on client src and dst addresses at stream level 2021-10-27 11:34:21 +02:00
h1.c CLEANUP: Apply ist.cocci 2021-11-08 08:05:39 +01:00
h1_htx.c BUG/MEDIUM: mux-h1: Adjust conditions to ask more space in the channel buffer 2021-09-23 16:13:17 +02:00
h2.c CLEANUP: Apply ist.cocci 2021-11-08 08:05:39 +01:00
h3.c MINOR: h3: fix potential NULL dereference 2021-11-08 09:17:24 +01:00
haproxy.c MINOR: mworker: implement a reload failure counter 2021-11-10 15:53:01 +01:00
hash.c REORG: include: move base64.h, errors.h and hash.h from common to to haproxy/ 2020-06-11 10:18:56 +02:00
hlua.c BUG/MINOR: httpclient/lua: rcv freeze when no request payload 2021-11-08 17:36:31 +01:00
hlua_fcn.c BUILD: idleconns: include missing ebmbtree.h at several places 2021-10-07 01:36:51 +02:00
hpack-dec.c CLEANUP: Use isttest(const struct ist) whenever possible 2021-03-03 05:07:10 +01:00
hpack-enc.c CLEANUP: include: tree-wide alphabetical sort of include files 2020-06-11 10:18:59 +02:00
hpack-huff.c CONTRIB: move some dev-specific tools to dev/ 2021-04-02 17:48:42 +02:00
hpack-tbl.c MINOR: pool: move pool declarations to read_mostly 2021-04-10 19:27:41 +02:00
http.c MINOR: http: Add 422-Unprocessable-Content error message 2021-09-28 16:21:25 +02:00
http_acl.c CLEANUP: acl: don't reference the generic pattern deletion function anymore 2020-11-05 19:27:09 +01:00
http_act.c BUG/MEDIUM: sample: Cumulate frontend and backend sample validity flags 2021-10-15 14:12:19 +02:00
http_ana.c Revert "BUG/MINOR: http-ana: Don't eval front after-response rules if stopped on back" 2021-11-09 18:02:49 +01:00
http_client.c BUG/MEDIUM: httpclient/cli: free of unallocated hc->req.uri 2021-11-10 17:02:50 +01:00
http_conv.c BUG/MINOR threads: Use get_(local|gm)time instead of (local|gm)time 2021-08-30 06:14:32 +02:00
http_fetch.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
http_htx.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
http_rules.c BUG/MEDIUM: sample: Cumulate frontend and backend sample validity flags 2021-10-15 14:12:19 +02:00
htx.c CLEANUP: Apply ist.cocci 2021-11-08 08:05:39 +01:00
init.c CLEANUP: lists/tree-wide: rename some list operations to avoid some confusion 2021-04-21 09:20:17 +02:00
jwt.c BUG/MINOR: jwt: Fix jwt_parse_alg incorrectly returning JWS_ALG_NONE 2021-11-03 17:19:48 +01:00
lb_chash.c MINOR: server: replace the pendconns-related stuff with a struct queue 2021-06-22 18:43:14 +02:00
lb_fas.c MINOR: server: replace the pendconns-related stuff with a struct queue 2021-06-22 18:43:14 +02:00
lb_fwlc.c BUG/MEDIUM: leastconn: fix rare possibility of divide by zero 2021-09-22 07:24:02 +02:00
lb_fwrr.c CLEANUP: assorted typo fixes in the code and comments 2021-08-16 12:37:59 +02:00
lb_map.c MINOR: server: replace the pendconns-related stuff with a struct queue 2021-06-22 18:43:14 +02:00
listener.c CLEANUP: listeners: remove unreachable code in clone_listener() 2021-10-16 14:58:30 +02:00
log.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
lru.c CLEANUP: lists/tree-wide: rename some list operations to avoid some confusion 2021-04-21 09:20:17 +02:00
mailers.c MINOR: task: provide 3 task_new_* wrappers to simplify the API 2021-10-01 18:36:29 +02:00
map.c MINOR: map/acl: print the count of all the map/acl entries in "show map/acl" 2021-05-25 08:44:45 +02:00
mjson.c MINOR: sample: converter: Add mjson library. 2021-04-15 17:05:38 +02:00
mqtt.c CLEANUP: Apply ist.cocci 2021-11-05 07:48:38 +01:00
mux_fcgi.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
mux_h1.c MINOR: mux-h1: Slightly Improve H1 traces 2021-11-10 11:45:27 +01:00
mux_h2.c BUG/MINOR: mux-h2: Fix H2_CF_DEM_SHORT_READ value 2021-11-10 18:04:36 +01:00
mux_pt.c MINOR: stream-int: Notify mux when the buffer is not stuck when calling rcv_buf 2021-09-23 16:25:47 +02:00
mux_quic.c MINOR: mux-quic: fix gcc11 warning 2021-11-08 08:59:30 +01:00
mworker-prog.c BUG/MINOR: mworker: doesn't launch the program postparser 2021-11-10 15:53:01 +01:00
mworker.c MINOR: mworker: change the way we set PROC_O_LEAVING 2021-11-10 15:53:01 +01:00
namespace.c REORG: include: move the error reporting functions to from log.h to errors.h 2020-06-11 10:18:59 +02:00
pattern.c CLEANUP: Add haproxy/xxhash.h to avoid modifying import/xxhash.h 2021-09-11 19:58:45 +02:00
payload.c BUILD: payload: include tools.h in payload.c 2021-05-08 13:55:40 +02:00
peers.c MINOR: stream: Use backend stream-interface dst address instead of target_addr 2021-10-27 11:35:59 +02:00
pipe.c CLEANUP: atomic/tree-wide: replace single increments/decrements with inc/dec 2021-04-07 18:18:37 +02:00
pool.c BUG/MINOR: pools: don't mark ourselves as harmless in DEBUG_UAF mode 2021-11-12 11:17:37 +01:00
proto_quic.c MINOR: quic: Allocate listener RX buffers 2021-11-05 15:20:04 +01:00
proto_sockpair.c MINOR: protocols: add a new protocol type selector 2021-10-27 17:05:36 +02:00
proto_tcp.c MINOR: protocols: add a new protocol type selector 2021-10-27 17:05:36 +02:00
proto_udp.c MINOR: protocols: add a new protocol type selector 2021-10-27 17:05:36 +02:00
proto_uxdg.c MINOR: protocols: add a new protocol type selector 2021-10-27 17:05:36 +02:00
proto_uxst.c MINOR: protocols: add a new protocol type selector 2021-10-27 17:05:36 +02:00
protocol.c MINOR: protocols: make use of the protocol type to select the protocol 2021-10-27 17:31:20 +02:00
proxy.c BUG/MINOR: proxy: Release ACLs and TCP/HTTP rules of default proxies 2021-10-15 14:33:35 +02:00
qpack-dec.c MINOR: qpack: fix memory leak on huffman decoding 2021-10-08 15:45:57 +02:00
qpack-enc.c MINOR: h3/qpack: fix gcc11 warnings 2021-11-08 08:59:30 +01:00
qpack-tbl.c MINOR: qpack: fix wrong comment 2021-09-23 15:27:25 +02:00
queue.c BUG/MAJOR: queue: better protect a pendconn being picked from the proxy 2021-08-31 18:37:13 +02:00
quic_cc.c MINOR: quic: Import C source code files for QUIC protocol. 2020-12-23 11:57:26 +01:00
quic_cc_newreno.c MINOR: quic: Add traces to congestion avoidance NewReno callback. 2020-12-23 11:57:26 +01:00
quic_frame.c MINOR: quic: Constantness fixes for frame builders/parsers. 2021-09-23 15:27:25 +02:00
quic_sock.c MINOR: quic: Fix potential null pointer dereference 2021-11-08 11:31:12 +01:00
quic_tls.c MINOR: quic: Make QUIC-TLS support at least two initial salts 2021-09-23 15:27:25 +02:00
raw_sock.c CLEANUP: tree-wide: remove unneeded include time.h in ~20 files 2021-10-07 01:41:14 +02:00
regex.c OPTIM: regex: PCRE2 use JIT match when JIT optimisation occured. 2020-08-14 07:53:40 +02:00
resolvers.c MEDIUM: resolvers: rename dns extra counters to resolvers extra counters 2021-11-03 17:16:46 +01:00
ring.c CLEANUP: lists/tree-wide: rename some list operations to avoid some confusion 2021-04-21 09:20:17 +02:00
sample.c MINOR: jwt: Make invalid static JWT algorithms an error in jwt_verify converter 2021-11-03 11:15:32 +01:00
server.c CLEANUP: Apply ha_free.cocci 2021-11-05 07:48:38 +01:00
server_state.c MINOR: proxy: Introduce proxy flags to replace disabled bitfield 2021-10-15 14:12:19 +02:00
session.c MINOR: session: Rely on client source address at session level to log error 2021-10-27 11:34:21 +02:00
sha1.c BUILD: use inttypes.h instead of stdint.h 2019-04-01 07:44:56 +02:00
shctx.c CLEANUP: shctx: remove the different inter-process locking techniques 2021-06-15 16:52:42 +02:00
signal.c CLEANUP: lists/tree-wide: rename some list operations to avoid some confusion 2021-04-21 09:20:17 +02:00
sink.c MINOR: stream: Use backend stream-interface dst address instead of target_addr 2021-10-27 11:35:59 +02:00
slz.c CLEANUP: slz: Mark reset_refs as static 2021-09-24 15:07:50 +02:00
sock.c MINOR: protocols: make use of the protocol type to select the protocol 2021-10-27 17:31:20 +02:00
sock_inet.c MEDIUM: listeners: split the thread mask between receiver and bind_conf 2021-10-14 21:27:48 +02:00
sock_unix.c MEDIUM: listeners: split the thread mask between receiver and bind_conf 2021-10-14 21:27:48 +02:00
ssl_ckch.c CLEANUP: Apply ha_free.cocci 2021-11-05 07:48:38 +01:00
ssl_crtlist.c MEDIUM: ssl: Chain ckch instances in ca-file entries 2021-05-17 10:50:24 +02:00
ssl_sample.c MINOR: ssl: make the ssl_fc_sni() sample-fetch function always available 2021-11-06 09:20:07 +01:00
ssl_sock.c REORG: ssl-sock: move the sslconns/totalsslconns counters to global 2021-10-07 01:41:14 +02:00
ssl_utils.c MINOR: sample: Expose SSL captures using new fetchers 2021-08-26 19:48:34 +02:00
stats.c MINOR: promex: backend aggregated server check status 2021-11-09 10:51:08 +01:00
stick_table.c MINOR: proxy: Introduce proxy flags to replace disabled bitfield 2021-10-15 14:12:19 +02:00
stream.c MINOR: stream/mux: implement websocket stream flag 2021-11-03 16:24:48 +01:00
stream_interface.c BUG/MEDIUM: stream-int: Block reads if channel cannot receive more data 2021-11-02 16:55:01 +01:00
task.c BUG/MINOR: task: do not set TASK_F_USR1 for no reason 2021-10-21 16:17:29 +02:00
tcp_act.c MINOR: tcp-act: Add set-src/set-src-port for "tcp-request content" rules 2021-10-27 11:35:59 +02:00
tcp_rules.c MEDIUM: tcp-rules: Eval TCP rules defined in defaults sections 2021-10-15 14:12:19 +02:00
tcp_sample.c MINOR: tcp-sample: Add samples to get original info about client connection 2021-10-27 11:35:59 +02:00
tcpcheck.c CLEANUP: Apply ist.cocci 2021-11-08 12:08:26 +01:00
thread.c MINOR: threads: add a new function to resolve config groups and masks 2021-10-08 17:22:26 +02:00
time.c REORG: time: move time-keeping code and variables to clock.c 2021-10-08 17:22:26 +02:00
tools.c MINOR: protocols: make use of the protocol type to select the protocol 2021-10-27 17:31:20 +02:00
trace.c CLEANUP: cli/tree-wide: properly re-align the CLI commands' help messages 2021-05-07 11:51:26 +02:00
uri_auth.c CLEANUP: Compare the return value of XXXcmp() functions with zero 2021-01-04 10:09:02 +01:00
uri_normalizer.c MINOR: uri_normalizer: Add fragment-encode normalizer 2021-05-11 17:24:32 +02:00
vars.c MINOR: vars: add "set-var" for "tcp-request connection" rules. 2021-11-02 17:58:35 +01:00
version.c BUILD: Fix build by including haproxy/global.h 2020-06-16 23:36:04 +02:00
wdt.c REORG: thread/sched: move the thread_info flags to the thread_ctx 2021-10-08 17:22:26 +02:00
xprt_handshake.c MEDIUM: connections: Implement a start() method for xprt_handshake. 2021-03-19 15:33:04 +01:00
xprt_quic.c MINOR: quic: Fix potential null pointer dereference 2021-11-08 11:31:12 +01:00