]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
5 years agoBUG/MEDIUM: dns: Consider the fact that dns answers are case-insensitive
Olivier Houchard [Wed, 1 Apr 2020 16:30:27 +0000 (18:30 +0200)] 
BUG/MEDIUM: dns: Consider the fact that dns answers are case-insensitive

We can't expect the DNS answer to always match the case we used for the
request, so we can't just use memcmp() to compare the DNS answer with what
we are expected.
Instead, introduce dns_hostname_cmp(), which compares each string in a
case-insensitive way.
This should fix github issue #566.

This should be backported to 2.1, 2.0, 1.9 and 1.8.

5 years agoREGTEST: make the unique-id test depend on version 2.0
Willy Tarreau [Wed, 1 Apr 2020 14:08:43 +0000 (16:08 +0200)] 
REGTEST: make the unique-id test depend on version 2.0

Regtest unique-id.vtc was added by commit 5fcec84c58 ("REGTEST: Add
unique-id reg-test") but it relies on the "uuid" sample fetch which
is only available in version 2.0 and above. Let's reflect that in
the REQUIRE_VERSION tag.

5 years agoMINOR: connections: Don't mark conn flags 0x00000001 and 0x00000002 as unused.
Olivier Houchard [Tue, 31 Mar 2020 21:04:20 +0000 (23:04 +0200)] 
MINOR: connections: Don't mark conn flags 0x00000001 and 0x00000002 as unused.

Remove the comments saying 0x00000001 and 0x00000002 are unused, they are
now used by CO_FL_SAFE_LIST and CO_FL_IDLE_LIST.

5 years agoDOC: internals: Fix spelling errors in filters.txt
Miroslav Zagorac [Thu, 26 Mar 2020 19:45:04 +0000 (20:45 +0100)] 
DOC: internals: Fix spelling errors in filters.txt

5 years agoBUG/MINOR: stats: Fix color of draining servers on stats page
Daniel Corbett [Sat, 28 Mar 2020 16:35:50 +0000 (12:35 -0400)] 
BUG/MINOR: stats: Fix color of draining servers on stats page

This patch fixes #53 where it was noticed that when an active
server is set to DRAIN it no longer has the color blue reflected
within the stats page. This patch addresses that and adds the
color back to drain. It's to be noted that backup servers are
configured to have an orange color when they are draining.

Should be backported as far as 1.7.

5 years agoCLEANUP: assorted typo fixes in the code and comments
Ilya Shipitsin [Mon, 23 Mar 2020 17:28:40 +0000 (22:28 +0500)] 
CLEANUP: assorted typo fixes in the code and comments

This is fifth iteration of typo fixes

5 years agoREGTEST: make the PROXY TLV validation depend on version 2.2
Willy Tarreau [Tue, 31 Mar 2020 14:36:20 +0000 (16:36 +0200)] 
REGTEST: make the PROXY TLV validation depend on version 2.2

Regtest proxy_protocol_tlv_validation was added by commit 488ee7fb6e
("BUG/MAJOR: proxy_protocol: Properly validate TLV lengths") but it
relies on a trick involving http-after-response to append a header
after a 400-badreq response, which is not possible in earlier versions,
so make it depend on 2.2.

5 years agoREGTEST: ssl/cli: change test type to devel
William Lallemand [Tue, 31 Mar 2020 12:48:34 +0000 (14:48 +0200)] 
REGTEST: ssl/cli: change test type to devel

Change the type of test from slow to devel for add_ssl-crt-list.vtc and
set_ssl_cert.vtc.

5 years agoBUG/MINOR: ssl: entry->ckch_inst not initialized
William Lallemand [Tue, 31 Mar 2020 12:31:41 +0000 (14:31 +0200)] 
BUG/MINOR: ssl: entry->ckch_inst not initialized

The head of the list entry->ckch_inst was not initialized when opening a
directory or reading a crt-list.

5 years agoREGTEST: ssl/cli: test the 'add ssl crt-list' command
William Lallemand [Tue, 31 Mar 2020 10:13:34 +0000 (12:13 +0200)] 
REGTEST: ssl/cli: test the 'add ssl crt-list' command

Test the 'add ssl crt-list' feature by inserting the ecdsa.pem
certificate and verifying with curl and strict-sni that it works.

5 years agoMEDIUM: ssl/cli: 'add ssl crt-list' command
William Lallemand [Wed, 25 Mar 2020 13:42:37 +0000 (14:42 +0100)] 
MEDIUM: ssl/cli: 'add ssl crt-list' command

The new 'add ssl crt-list' command allows to add a new crt-list entry in
a crt-list (or a directory since they are handled the same way).

The principle is basicaly the same as the "commit ssl cert" command with
the exception that it iterates on every bind_conf that uses the crt-list
and generates a ckch instance (ckch_inst) for each of them.

The IO handler yield every 10 bind_confs so HAProxy does not get stuck in
a too much time consuming generation if it needs to generate too much
SSL_CTX'.

This command does not handle the SNI filters and the SSL configuration
yet.

Example:

  $ echo "new ssl cert foo.net.pem" | socat /tmp/sock1 -
  New empty certificate store 'foo.net.pem'!

  $ echo -e -n "set ssl cert foo.net.pem <<\n$(cat foo.net.pem)\n\n" | socat /tmp/sock1 -
  Transaction created for certificate foo.net.pem!

  $ echo "commit ssl cert foo.net.pem" | socat /tmp/sock1 -
  Committing foo.net.pem
  Success!

  $ echo "add ssl crt-list one.crt-list foo.net.pem" | socat /tmp/sock1 -
  Inserting certificate 'foo.net.pem' in crt-list 'one.crt-list'......
  Success!

  $ echo "show ssl crt-list one.crt-list" | socat /tmp/sock1 -
  # one.crt-list
  0x55d17d7be360 kikyo.pem.rsa [ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3]
  0x55d17d82cb10 foo.net.pem

5 years agoMINOR: ssl/cli: update pointer to store in 'commit ssl cert'
William Lallemand [Mon, 30 Mar 2020 17:29:45 +0000 (19:29 +0200)] 
MINOR: ssl/cli: update pointer to store in 'commit ssl cert'

The crtlist_entry structure use a pointer to the store as key.
That's a problem with the dynamic update of a certificate over the CLI,
because it allocates a new ckch_store. So updating the pointers is
needed. To achieve that, a linked list of the crtlist_entry was added in
the ckch_store, so it's easy to iterate on this list to update the
pointers. Another solution would have been to rework the system so we
don't allocate a new ckch_store, but it requires a rework of the ckch
code.

5 years agoMINOR: ssl: store a ptr to crtlist in crtlist_entry
William Lallemand [Mon, 30 Mar 2020 17:59:57 +0000 (19:59 +0200)] 
MINOR: ssl: store a ptr to crtlist in crtlist_entry

Store a pointer to crtlist in crtlist_entry so we can re-insert a
crtlist_entry in its crtlist ebpt after updating its key.

5 years agoMINOR: ssl: add a list of crtlist_entry in ckch_store
William Lallemand [Mon, 30 Mar 2020 16:27:58 +0000 (18:27 +0200)] 
MINOR: ssl: add a list of crtlist_entry in ckch_store

When updating a ckch_store we may want to update its pointer in the
crtlist_entry which use it. To do this, we need the list of the entries
using the store.

5 years agoMINOR: ssl: use crtlist_free() upon error in directory loading
William Lallemand [Mon, 30 Mar 2020 16:19:43 +0000 (18:19 +0200)] 
MINOR: ssl: use crtlist_free() upon error in directory loading

Replace the manual cleaninp which is done in crtlist_load_cert_dir() by
a call to the crtlist_free() function.

5 years agoREORG: ssl: move some functions above crtlist_load_cert_dir()
William Lallemand [Mon, 30 Mar 2020 16:45:10 +0000 (18:45 +0200)] 
REORG: ssl: move some functions above crtlist_load_cert_dir()

Move some function above crtlist_load_cert_dir() so
crtlist_load_cert_dir() is at the right place, and crtlist_free() can be
used inside.

5 years agoBUG/MINOR: ssl: ckch_inst wrongly inserted in crtlist_entry
William Lallemand [Mon, 30 Mar 2020 15:01:33 +0000 (17:01 +0200)] 
BUG/MINOR: ssl: ckch_inst wrongly inserted in crtlist_entry

The instances were wrongly inserted in the crtlist entries, all
instances of a crt-list were inserted in the last crt-list entry.
Which was kind of handy to free all instances upon error.

Now that it's done correctly, the error path was changed, it must
iterate on the entries and find the ckch_insts which were generated for
this bind_conf. To avoid wasting time, it stops the iteration once it
found the first unsuccessful generation.

5 years agoREORG: ssl: move SETCERT enum to ssl_sock.h
William Lallemand [Wed, 25 Mar 2020 19:20:26 +0000 (20:20 +0100)] 
REORG: ssl: move SETCERT enum to ssl_sock.h

Move the SETCERT enum at the right place to cleanup ssl_sock.c.

5 years agoMINOR: ssl: add a list of bind_conf in struct crtlist
William Lallemand [Wed, 25 Mar 2020 14:10:49 +0000 (15:10 +0100)] 
MINOR: ssl: add a list of bind_conf in struct crtlist

In order to be able to add new certificate in a crt-list, we need the
list of bind_conf that uses this crt-list so we can create a ckch_inst
for each of them.

5 years agoMINOR: cli: add a general purpose pointer in the CLI struct
William Lallemand [Fri, 27 Mar 2020 16:21:11 +0000 (17:21 +0100)] 
MINOR: cli: add a general purpose pointer in the CLI struct

This patch adds a p2 generic pointer which is inialized to zero before
calling the parser.

5 years agoMEDIUM: connections: Revamp the way idle connections are killed
Olivier Houchard [Sun, 29 Mar 2020 22:23:57 +0000 (00:23 +0200)] 
MEDIUM: connections: Revamp the way idle connections are killed

The original algorithm always killed half the idle connections. This doesn't
take into account the way the load can change. Instead, we now kill half
of the exceeding connections (exceeding connection being the number of
used + idle connections past the last maximum used connections reached).
That way if we reach a peak, we will kill much less, and it'll slowly go back
down when there's less usage.

5 years agoMINOR: servers: Add a counter for the number of currently used connections.
Olivier Houchard [Wed, 25 Mar 2020 18:41:03 +0000 (19:41 +0100)] 
MINOR: servers: Add a counter for the number of currently used connections.

Add a counter to know the current number of used connections, as well as the
max, this will be used later to refine the algorithm used to kill idle
connections, based on current usage.

5 years agoMEDIUM: stream: support use-server rules with dynamic names
Jerome Magnin [Sun, 29 Mar 2020 07:37:12 +0000 (09:37 +0200)] 
MEDIUM: stream: support use-server rules with dynamic names

With server-template was introduced the possibility to scale the
number of servers in a backend without needing a configuration change
and associated reload. On the other hand it became impractical to
write use-server rules for these servers as they would only accept
existing server labels as argument. This patch allows the use of
log-format notation to describe targets of a use-server rules, such
as in the example below:

  listen test
    bind *:1234
    use-server %[hdr(srv)] if { hdr(srv) -m found }
    use-server s1 if { path / }
    server s1 127.0.0.1:18080
    server s2 127.0.0.1:18081

If a use-server rule is applied because it was conditionned by an
ACL returning true, but the target of the use-server rule cannot be
resolved, no other use-server rule is evaluated and we fall back to
load balancing.

This feature was requested on the ML, and bumped with issue #563.

5 years agoMINOR: listener: add so_name sample fetch
Jerome Magnin [Fri, 27 Mar 2020 21:08:40 +0000 (22:08 +0100)] 
MINOR: listener: add so_name sample fetch

Add a sample fetch for the name of a bind. This can be useful to
take decisions when PROXY protocol is used and we can't rely on dst,
such as the sample config below.

  defaults
    mode http
  listen bar
    bind 127.0.0.1:1111
    server s1 127.0.1.1:1234 send-proxy

  listen foo
    bind 127.0.1.1:1234 name foo accept-proxy
    http-request return status 200 hdr dst %[dst] if { dst 127.0.1.1 }

5 years agoMINOR: ssl: skip self issued CA in cert chain for ssl_ctx
Emmanuel Hocdet [Fri, 28 Feb 2020 15:00:34 +0000 (16:00 +0100)] 
MINOR: ssl: skip self issued CA in cert chain for ssl_ctx

First: self issued CA, aka root CA, is the enchor for chain validation,
no need to send it, client must have it. HAProxy can skip it in ssl_ctx.
Second: the main motivation to skip root CA in ssl_ctx is to be able to
provide it in the chain without drawback. Use case is to provide issuer
for ocsp without the need for .issuer and be able to share it in
issuers-chain-path. This concerns all certificates without intermediate
certificates. It's useless for BoringSSL, .issuer is ignored because ocsp
bits doesn't need it.

5 years agoBUG/MEDIUM: dns: improper parsing of aditional records
Baptiste Assmann [Wed, 19 Feb 2020 00:08:51 +0000 (01:08 +0100)] 
BUG/MEDIUM: dns: improper parsing of aditional records

13a9232ebc63fdf357ffcf4fa7a1a5e77a1eac2b introduced parsing of
Additionnal DNS response section to pick up IP address when available.
That said, this introduced a side effect for other query types (A and
AAAA) leading to consider those responses invalid when parsing the
Additional section.
This patch avoids this situation by ensuring the Additional section is
parsed only for SRV queries.

5 years agoCLEANUP: remove obsolete comments
Baptiste Assmann [Tue, 18 Feb 2020 23:53:26 +0000 (00:53 +0100)] 
CLEANUP: remove obsolete comments

This patch removes some old comments introduced by
13a9232ebc63fdf357ffcf4fa7a1a5e77a1eac2b.
Those comments are related to issues already fixed.

5 years agoMINOR: build: Fix build in mux_h1
Olivier Houchard [Wed, 25 Mar 2020 16:05:21 +0000 (17:05 +0100)] 
MINOR: build: Fix build in mux_h1

We want to check if the input buffer contains data, not the connection.
This should unbreak the build.

5 years agoBUG/MEDIUM: mux_h1: Process a new request if we already received it.
Olivier Houchard [Wed, 25 Mar 2020 11:24:11 +0000 (12:24 +0100)] 
BUG/MEDIUM: mux_h1: Process a new request if we already received it.

In h1_detach(), if our input buffer isn't empty, don't just subscribe(), we
may hold a new request, and there's nothing left to read. Instead, call
h1_process() directly, so that a new stream is created.
Failure to do so means if we received the new request to early, the
connecetion will just hang, as it happens when using svn.

5 years agoCI: github actions: add weekly h2spec test
Ilya Shipitsin [Tue, 24 Mar 2020 19:46:14 +0000 (00:46 +0500)] 
CI: github actions: add weekly h2spec test

link: https://www.mail-archive.com/haproxy@formilux.org/msg36753.html
this commit adds scheduled run of h2spec tool to test http2 and HPACK
compliance.

h2spec might be found at: https://github.com/summerwind/h2spec

5 years agoBUG/MINOR: peers: Use after free of "peers" section.
Frédéric Lécaille [Tue, 24 Mar 2020 19:08:30 +0000 (20:08 +0100)] 
BUG/MINOR: peers: Use after free of "peers" section.

When a "peers" section has not any local peer, it is removed of the list
of "peers" sections by check_config_validity(). But a stick-table which
refers to a "peers" section stores a pointer to this peers section.
These pointer must be reset to NULL value for each stick-table refering to
such a "peers" section to prevent stktable_init() to start the peers frontend
attached to the peers section dereferencing the invalid pointer.

Furthemore this patch stops the peers frontend as this is done for other
configurations invalidated by check_config_validity().

Thank you to Olivier D for having reported this issue with such a
simple configuration file which made haproxy crash when started with
-c option for configuration file validation.

  defaults
    mode http

  peers mypeers
    peer toto 127.0.0.1:1024

  backend test
    stick-table type ip size 10k expire 1h store http_req_rate(1h) peers mypeers

Must be backported to 2.1 and 2.0.

5 years agoBUG/MINOR: peers: avoid an infinite loop with peers_fe is NULL
William Lallemand [Tue, 24 Mar 2020 15:42:15 +0000 (16:42 +0100)] 
BUG/MINOR: peers: avoid an infinite loop with peers_fe is NULL

Fix an infinite loop which was added in an attempt to fix #558.
If the peers_fe is NULL, it will loop forever.

Must be backported with a2cfd7e as far as 1.8.

5 years agoBUG/MINOR: peers: init bind_proc to 1 if it wasn't initialized
William Lallemand [Tue, 24 Mar 2020 15:02:48 +0000 (16:02 +0100)] 
BUG/MINOR: peers: init bind_proc to 1 if it wasn't initialized

Tim reported that in master-worker mode, if a stick-table is declared
but not used in the configuration, its associated peers listener won't
bind.

This problem is due the fact that the master-worker and the daemon mode,
depend on the bind_proc field of the peers proxy to disable the listener.
Unfortunately the bind_proc is left to 0 if no stick-table were used in
the configuration, stopping the listener on all processes.

This fixes sets the bind_proc to the first process if it wasn't
initialized.

Should fix bug #558. Should be backported as far as 1.8.

5 years agoMINOR: ssl: rework add cert chain to CTX to be libssl independent
Emmanuel Hocdet [Fri, 28 Feb 2020 15:00:34 +0000 (16:00 +0100)] 
MINOR: ssl: rework add cert chain to CTX to be libssl independent

SSL_CTX_set1_chain is used for openssl >= 1.0.2 and a loop with
SSL_CTX_add_extra_chain_cert for openssl < 1.0.2.
SSL_CTX_add_extra_chain_cert exist with openssl >= 1.0.2 and can be
used for all openssl version (is new name is SSL_CTX_add0_chain_cert).
This patch use SSL_CTX_add_extra_chain_cert to remove any #ifdef for
compatibilty. In addition sk_X509_num()/sk_X509_value() replace
sk_X509_shift() to extract CA from chain, as it is used in others part
of the code.

5 years agoCLEANUP: ssl: rename ssl_get_issuer_chain to ssl_get0_issuer_chain
Emmanuel Hocdet [Mon, 23 Mar 2020 10:29:11 +0000 (11:29 +0100)] 
CLEANUP: ssl: rename ssl_get_issuer_chain to ssl_get0_issuer_chain

Rename ssl_get_issuer_chain to ssl_get0_issuer_chain to be consistent
with openssl >= 1.0.2 API.

5 years agoBUG/MINOR: ssl: memory leak when find_chain is NULL
Emmanuel Hocdet [Mon, 23 Mar 2020 09:31:47 +0000 (10:31 +0100)] 
BUG/MINOR: ssl: memory leak when find_chain is NULL

This bug was introduced by 85888573 "BUG/MEDIUM: ssl: chain must be
initialized with sk_X509_new_null()". No need to set find_chain with
sk_X509_new_null(), use find_chain conditionally to fix issue #516.

This bug was referenced by issue #559.

[wla: fix some alignment/indentation issue]

5 years ago[RELEASE] Released version 2.2-dev5 v2.2-dev5
Willy Tarreau [Mon, 23 Mar 2020 08:43:45 +0000 (09:43 +0100)] 
[RELEASE] Released version 2.2-dev5

Released version 2.2-dev5 with the following main changes :
    - CLEANUP: ssl: is_default is a bit in ckch_inst
    - BUG/MINOR: ssl/cli: sni_ctx' mustn't always be used as filters
    - DOC: ssl: clarify security implications of TLS tickets
    - CLEANUP: remove support for Linux i686 vsyscalls
    - CLEANUP: drop support for USE_MY_ACCEPT4
    - CLEANUP: remove support for USE_MY_EPOLL
    - CLEANUP: remove support for USE_MY_SPLICE
    - CLEANUP: remove the now unused common/syscall.h
    - BUILD: make dladdr1 depend on glibc version and not __USE_GNU
    - BUILD: wdt: only test for SI_TKILL when compiled with thread support
    - BUILD: Makefile: the compiler-specific flags should all be in SPEC_CFLAGS
    - CLEANUP: ssl: separate the directory loading in a new function
    - BUG/MINOR: buffers: MT_LIST_DEL_SAFE() expects the temporary pointer.
    - BUG/MEDIUM: mt_lists: Make sure we set the deleted element to NULL;
    - MINOR: init: move the maxsock calculation code to compute_ideal_maxsock()
    - MEDIUM: init: always try to push the FD limit when maxconn is set from -m
    - BUG/MAJOR: list: fix invalid element address calculation
    - BUILD: stream-int: fix a few includes dependencies
    - MINOR: mt_lists: Appease gcc.
    - MINOR: lists: Implement function to convert list => mt_list and mt_list => list
    - MINOR: servers: Kill priv_conns.
    - MINOR: lists: fix indentation.
    - BUG/MEDIUM: random: align the state on 2*64 bits for ARM64
    - BUG/MEDIUM: connections: Don't assume the connection has a valid session.
    - BUG/MEDIUM: pools: Always update free_list in pool_gc().
    - BUG/MINOR: haproxy: always initialize sleeping_thread_mask
    - BUG/MINOR: listener/mq: do not dispatch connections to remote threads when stopping
    - BUG/MINOR: haproxy/threads: try to make all threads leave together
    - Revert "BUILD: travis-ci: enable s390x builds"
    - BUILD: travis-ci: enable regular s390x builds
    - DOC: proxy_protocol: Reserve TLV type 0x05 as PP2_TYPE_UNIQUE_ID
    - MINOR: proxy_protocol: Ingest PP2_TYPE_UNIQUE_ID on incoming connections
    - MEDIUM: proxy_protocol: Support sending unique IDs using PPv2
    - CLEANUP: connection: Add blank line after declarations in PP handling
    - CLEANUP: assorted typo fixes in the code and comments
    - CI: add spellcheck github action
    - DOC: correct typo in alert message about rspirep
    - CI: travis: switch linux builds to clang-9
    - MINOR: debug: add a new DISGUISE() macro to pass a value as identity
    - MINOR: debug: consume the write() result in BUG_ON() to silence a warning
    - MINOR: use DISGUISE() everywhere we deliberately want to ignore a result
    - BUILD: pools: silence build warnings with DEBUG_MEMORY_POOLS and DEBUG_UAF
    - CLEANUP: connection: Stop directly setting an ist's .ptr
    - CI: travis: revert to clang-7 for BoringSSL tests
    - BUILD: on ARM, must be linked to libatomic.
    - BUILD: makefile: fix regex syntax in ARM platform detection
    - BUG/MEDIUM: peers: resync ended with RESYNC_PARTIAL in wrong cases.
    - REORG: ssl: move ssl_sock_load_cert()
    - MINOR: ssl: pass ckch_inst to ssl_sock_load_ckchs()
    - MEDIUM: ssl: allow crt-list caching
    - MINOR: ssl: directories are loaded like crt-list
    - BUG/MINOR: ssl: can't open directories anymore
    - BUG/MEDIUM: spoe: dup agent's engine_id string from trash.area
    - MINOR: fd: Use a separate lock for logs instead of abusing the fd lock.
    - MINOR: mux_pt: Don't try to remove the connection from the idle list.
    - MINOR: ssl/cli: show/dump ssl crt-list
    - BUG/MINOR: ssl/cli: free the trash chunk in dump_crtlist
    - MEDIUM: fd: Introduce a running mask, and use it instead of the spinlock.
    - BUG/MINOR: ssl: memory leak in crtlist_parse_file()
    - MINOR: tasks: Provide the tasklet to the callback.
    - BUG/MINOR: ssl: memleak of struct crtlist_entry
    - BUG/MINOR: pattern: Do not pass len = 0 to calloc()
    - BUILD: makefile: fix expression again to detect ARM platform
    - CI: travis: re-enable ASAN on clang
    - CI: travis: proper group output redirection together with travis_wait
    - DOC: assorted typo fixes in the documentation
    - MINOR: wdt: Move the definitions of WDTSIG and DEBUGSIG into types/signal.h.
    - BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue().
    - MINOR: memory: Change the flush_lock to a spinlock, and don't get it in alloc.
    - MINOR: ssl/cli: 'new ssl cert' command
    - MINOR: ssl/cli: show certificate status in 'show ssl cert'
    - MEDIUM: sessions: Don't be responsible for connections anymore.
    - MEDIUM: servers: Split the connections into idle, safe, and available.
    - MINOR: fd: Implement fd_takeover().
    - MINOR: connections: Add a new mux method, "takeover".
    - MINOR: connections: Make the "list" element a struct mt_list instead of list.
    - MINOR: connections: Add a flag to know if we're in the safe or idle list.
    - MEDIUM: connections: Attempt to get idle connections from other threads.
    - MEDIUM: mux_h1: Implement the takeover() method.
    - MEDIUM: mux_h2: Implement the takeover() method.
    - MEDIUM: mux_fcgi: Implement the takeover() method.
    - MEDIUM: connections: Kill connections even if we are reusing one.
    - BUG/MEDIUM: connections: Don't forget to decrement idle connection counters.
    - BUG/MINOR: ssl: Do not free garbage pointers on memory allocation failure
    - BUG/MINOR: ssl: Correctly add the 1 for the sentinel to the number of elements
    - BUG/MINOR: ssl: crtlist_dup_filters() must return NULL with fcount == 0
    - BUG/MEDIUM: build: Fix compilation by spelling decl correctly.
    - BUILD/MEDIUM: fd: Declare fd_mig_lock as extern.
    - CI: run travis-ci builds on push only, skip pull requests
    - CI: temporarily disable unstable travis arm64 builds
    - BUG/MINOR: ssl/cli: free BIO upon error in 'show ssl cert'
    - BUG/MINOR: connections: Make sure we free the connection on failure.
    - BUG/MINOR: ssl/cli: fix a potential NULL dereference
    - BUG/MEDIUM: h1: Make sure we subscribe before going into idle list.
    - BUG/MINOR: connections: Set idle_time before adding to idle list.
    - MINOR: muxes: Note that we can't usee a connection when added to the srv idle.
    - REGTEST: increase timeouts on the seamless-reload test
    - BUG/MINOR: haproxy/threads: close a possible race in soft-stop detection
    - CLEANUP: haproxy/threads: don't check global_tasks_mask twice

5 years agoCLEANUP: haproxy/threads: don't check global_tasks_mask twice
Willy Tarreau [Mon, 23 Mar 2020 08:33:32 +0000 (09:33 +0100)] 
CLEANUP: haproxy/threads: don't check global_tasks_mask twice

In run_thread_poll_loop() we test both for (global_tasks_mask & tid_bit)
and thread_has_tasks(), but the former is useless since this test is
already part of the latter.

5 years agoBUG/MINOR: haproxy/threads: close a possible race in soft-stop detection
Willy Tarreau [Mon, 23 Mar 2020 08:27:28 +0000 (09:27 +0100)] 
BUG/MINOR: haproxy/threads: close a possible race in soft-stop detection

Commit 4b3f27b ("BUG/MINOR: haproxy/threads: try to make all threads
leave together") improved the soft-stop synchronization but it left a
small race open because it looks at tasks_run_queue, which can drop
to zero then back to one while another thread picks the task from the
run queue to insert it into the tasklet_list. The risk is very low but
not null. In addition the condition didn't consider the possible presence
of signals in the queue.

This patch moves the stopping detection just after the "wake" calculation
which already takes care of the various queues' sizes and signals. It
avoids needlessly duplicating these tests.

The bug was discovered during a code review but will probably never be
observed. This fix may be backported to 2.1 and 2.0 along with the commit
above.

5 years agoREGTEST: increase timeouts on the seamless-reload test
Willy Tarreau [Mon, 23 Mar 2020 08:11:51 +0000 (09:11 +0100)] 
REGTEST: increase timeouts on the seamless-reload test

The abns_socket in seamless-reload regtest regularly fails in Travis-CI
on smaller machines only (typically the ppc64le and sometimes s390x).
The error always reports an incomplete HTTP header as seen from the
client. And this can occasionally be reproduced on the minicloud ppc64le
image when setting a huge file descriptors limit (1 million).

What happens in fact is the following: depending on the binding order,
some connections from the client might reach the TCP listener on the
old instance and be forwarded to the ABNS listener of the second
instance just being prepared to start up. But due to the huge number
of FDs, setting them up takes slightly more time and the 20ms server
timeout may expire before the new instance finishes its startup. This
can result in an occasional 504, except that since the client timeout
is the same as the server timeout, both sides are closed at the same
time and the client doesn't receive the 504.

In addition a second problem plugs onto this: by default http-reuse is
enabled. Some requests being forwarded to the older instance will be
sent over an already established connection. But the CPU used by the
starting process using many FDs will be taken away from the older
process, whose abns listener will not see a request for more than 20ms,
and will decide to kill the idle client connection. At the same moment
the TCP proxy forwards a request over this closing connection, it
detects the close and silently closes the other side to let the
client retry, which is detected by the vtest client as another case
of empty header. This is easier to reproduce in VMs with few CPUs
(2 or less) and some noisy neighbors such as a few spinning loops in
background.

Let's just increase this tests' timeout to avoid this. While a few
ms are close to the scheduler's granularity, this test is never
supposed to trigger the timeouts so it's safe to go higher without
impacts on the test execution time. At one second the problem seems
impossible to reproduce on the minicloud VMs.

5 years agoMINOR: muxes: Note that we can't usee a connection when added to the srv idle.
Olivier Houchard [Sun, 22 Mar 2020 22:25:51 +0000 (23:25 +0100)] 
MINOR: muxes: Note that we can't usee a connection when added to the srv idle.

In the various muxes, add a comment documenting that once
srv_add_to_idle_list() got called, any thread may pick that conenction up,
so it is unsafe to access the mux context/the connection, the only thing we
can do is returning.

5 years agoBUG/MINOR: connections: Set idle_time before adding to idle list.
Olivier Houchard [Sun, 22 Mar 2020 18:59:52 +0000 (19:59 +0100)] 
BUG/MINOR: connections: Set idle_time before adding to idle list.

In srv_add_to_idle_list(), make sure we set the idle_time before we add
the connection to an idle list, not after, otherwise another thread may
grab it, set the idle_time to 0, only to have the original thread set it
back to now_ms.
This may have an impact, as in conn_free() we check idle_time to decide
if we should decrement the idle connection counters for the server.

5 years agoBUG/MEDIUM: h1: Make sure we subscribe before going into idle list.
Olivier Houchard [Sun, 22 Mar 2020 18:56:03 +0000 (19:56 +0100)] 
BUG/MEDIUM: h1: Make sure we subscribe before going into idle list.

In h1_detach(), make sure we subscribe before we call
srv_add_to_idle_list(), not after. As soon as srv_add_to_idle_list() is
called, and it is put in an idle list, another thread can take it, and
we're no longer allowed to subscribe.
This fixes a race condition when another thread grabs a connection as soon
as it is put, the original owner would subscribe, and thus the new thread
would fail to do so, and to activate polling.

5 years agoBUG/MINOR: ssl/cli: fix a potential NULL dereference
William Lallemand [Fri, 20 Mar 2020 13:42:36 +0000 (14:42 +0100)] 
BUG/MINOR: ssl/cli: fix a potential NULL dereference

Fix a potential NULL dereference in "show ssl cert" when we can't
allocate the <out> trash buffer.

This patch creates a new label so we could jump without trying to do the
ci_putchk in this case.

This bug was introduced by ea987ed ("MINOR: ssl/cli: 'new ssl cert'
command"). 2.2 only.

This bug was referenced by issue #556.

5 years agoBUG/MINOR: connections: Make sure we free the connection on failure.
Olivier Houchard [Fri, 20 Mar 2020 13:26:32 +0000 (14:26 +0100)] 
BUG/MINOR: connections: Make sure we free the connection on failure.

In connect_server(), make sure we properly free a newly created connection
if we somehow fail, and it has not yet been attached to a conn_stream, or
it would lead to a memory leak.
This should appease coverity for backend.c, as reported in inssue #556.

This should be backported to 2.1, 2.0 and 1.9

5 years agoBUG/MINOR: ssl/cli: free BIO upon error in 'show ssl cert'
William Lallemand [Fri, 20 Mar 2020 13:10:17 +0000 (14:10 +0100)] 
BUG/MINOR: ssl/cli: free BIO upon error in 'show ssl cert'

Fix a memory leak that could happen upon a "show ssl cert" if notBefore:
or notAfter: failed to extract its ASN1 string.

Introduced by d4f946c ("MINOR: ssl/cli: 'show ssl cert' give information
on the certificates"). 2.2 only.

5 years agoCI: temporarily disable unstable travis arm64 builds
Ilya Shipitsin [Wed, 18 Mar 2020 18:37:12 +0000 (23:37 +0500)] 
CI: temporarily disable unstable travis arm64 builds

[wt: arm64 shows timeouts during packages downloads and causes all
 builds to be reported as failures; building for arm64 on real hardware
 is still done on a regular basis and works fine however]

5 years agoCI: run travis-ci builds on push only, skip pull requests
Ilya Shipitsin [Wed, 18 Mar 2020 16:27:39 +0000 (21:27 +0500)] 
CI: run travis-ci builds on push only, skip pull requests

[wt: we have few pull reqs and they're automatically closed, however
 seeing them pop up here and there needlessly was adding noise to the
 reports]

5 years agoBUILD/MEDIUM: fd: Declare fd_mig_lock as extern.
Olivier Houchard [Fri, 20 Mar 2020 10:41:24 +0000 (11:41 +0100)] 
BUILD/MEDIUM: fd: Declare fd_mig_lock as extern.

Declare fd_mig_lock as extern so that it isn't defined multiple times.
This should fix build for architectures without double-width CAS.

5 years agoBUG/MEDIUM: build: Fix compilation by spelling decl correctly.
Olivier Houchard [Fri, 20 Mar 2020 10:03:38 +0000 (11:03 +0100)] 
BUG/MEDIUM: build: Fix compilation by spelling decl correctly.

Fix build on architectures for which double-width CAS isn't implemented by
spelling __decl_rwlock correctly.

5 years agoBUG/MINOR: ssl: crtlist_dup_filters() must return NULL with fcount == 0
William Lallemand [Fri, 20 Mar 2020 09:04:34 +0000 (10:04 +0100)] 
BUG/MINOR: ssl: crtlist_dup_filters() must return NULL with fcount == 0

crtlist_dup_filters() must return a NULL ptr if the fcount number is 0.

This bug was introduced by 2954c47 ("MEDIUM: ssl: allow crt-list caching").

5 years agoBUG/MINOR: ssl: Correctly add the 1 for the sentinel to the number of elements
Tim Duesterhus [Thu, 19 Mar 2020 15:12:10 +0000 (16:12 +0100)] 
BUG/MINOR: ssl: Correctly add the 1 for the sentinel to the number of elements

In `crtlist_dup_filters()` add the `1` to the number of elements instead of
the size of a single element.

This bug was introduced in commit 2954c478ebab019b814b97cbaec4653af7f03f34,
which is 2.2+. No backport needed.

5 years agoBUG/MINOR: ssl: Do not free garbage pointers on memory allocation failure
Tim Duesterhus [Thu, 19 Mar 2020 15:12:09 +0000 (16:12 +0100)] 
BUG/MINOR: ssl: Do not free garbage pointers on memory allocation failure

In `ckch_inst_sni_ctx_to_sni_filters` use `calloc()` to allocate the filter
array. When the function fails to allocate memory for a single entry the
whole array will be `free()`d using free_sni_filters(). With the previous
`malloc()` the pointers for entries after the failing allocation could
possibly be a garbage value.

This bug was introduced in commit 38df1c8006a2adf97f4ad5a183f80cfdcba3da8a,
which is 2.2+. No backport needed.

5 years agoBUG/MEDIUM: connections: Don't forget to decrement idle connection counters.
Olivier Houchard [Thu, 19 Mar 2020 22:52:28 +0000 (23:52 +0100)] 
BUG/MEDIUM: connections: Don't forget to decrement idle connection counters.

In conn_backend_get(), when we manage to get an idle connection from the
current thread's pool, don't forget to decrement the idle connection
counters, or we may end up not reusing connections when we could, and/or
killing connections when we shouldn't.

5 years agoMEDIUM: connections: Kill connections even if we are reusing one.
Olivier Houchard [Mon, 16 Mar 2020 12:49:00 +0000 (13:49 +0100)] 
MEDIUM: connections: Kill connections even if we are reusing one.

In connect_server(), if we notice we have more file descriptors opened than
we should, there's no reason not to close a connection just because we're
reusing one, so do it anyway.

5 years agoMEDIUM: mux_fcgi: Implement the takeover() method.
Olivier Houchard [Tue, 10 Mar 2020 17:46:06 +0000 (18:46 +0100)] 
MEDIUM: mux_fcgi: Implement the takeover() method.

Implement a takeover() method in the mux_fcgi, so that other threads may
take an idle connection over if they need it.

5 years agoMEDIUM: mux_h2: Implement the takeover() method.
Olivier Houchard [Tue, 10 Mar 2020 17:39:42 +0000 (18:39 +0100)] 
MEDIUM: mux_h2: Implement the takeover() method.

Implement a takeover() method in the mux_h2, so that other threads may
take an idle connection over if they need it.

5 years agoMEDIUM: mux_h1: Implement the takeover() method.
Olivier Houchard [Thu, 20 Feb 2020 15:00:18 +0000 (16:00 +0100)] 
MEDIUM: mux_h1: Implement the takeover() method.

Implement a takeover() method in the mux_h1, so that other threads may
take an idle connection over if they need it.

5 years agoMEDIUM: connections: Attempt to get idle connections from other threads.
Olivier Houchard [Fri, 6 Mar 2020 17:18:56 +0000 (18:18 +0100)] 
MEDIUM: connections: Attempt to get idle connections from other threads.

In connect_server(), if we no longer have any idle connections for the
current thread, attempt to use the new "takeover" mux method to steal a
connection from another thread.
This should have no impact right now, given no mux implements it.

5 years agoMINOR: connections: Add a flag to know if we're in the safe or idle list.
Olivier Houchard [Tue, 10 Mar 2020 17:04:37 +0000 (18:04 +0100)] 
MINOR: connections: Add a flag to know if we're in the safe or idle list.

Add flags to connections, CO_FL_SAFE_LIST and CO_FL_IDLE_LIST, to let one
know we are in the safe list, or the idle list.

5 years agoMINOR: connections: Make the "list" element a struct mt_list instead of list.
Olivier Houchard [Fri, 6 Mar 2020 17:12:03 +0000 (18:12 +0100)] 
MINOR: connections: Make the "list" element a struct mt_list instead of list.

Make the "list" element a struct mt_list, and explicitely use
list_from_mt_list to get a struct list * where it is used as such, so that
mt_list_for_each_entry will be usable with it.

5 years agoMINOR: connections: Add a new mux method, "takeover".
Olivier Houchard [Wed, 19 Feb 2020 16:18:57 +0000 (17:18 +0100)] 
MINOR: connections: Add a new mux method, "takeover".

Add a new mux method, "takeover", that will attempt to make the current thread
responsible for the connection.
It should return 0 on success, and non-zero on failure.

5 years agoMINOR: fd: Implement fd_takeover().
Olivier Houchard [Thu, 5 Mar 2020 17:10:51 +0000 (18:10 +0100)] 
MINOR: fd: Implement fd_takeover().

Implement a new function, fd_takeover(), that lets you become the thread
responsible for the fd. On architectures that do not have a double-width CAS,
use a global rwlock.
fd_set_running() was also changed to be able to compete with fd_takeover(),
either using a dooble-width CAS on both running_mask and thread_mask, or
by claiming a reader on the global rwlock. This extra operation should not
have any measurable impact on modern architectures where threading is
relevant.

5 years agoMEDIUM: servers: Split the connections into idle, safe, and available.
Olivier Houchard [Thu, 13 Feb 2020 18:12:07 +0000 (19:12 +0100)] 
MEDIUM: servers: Split the connections into idle, safe, and available.

Revamp the server connection lists. We know have 3 lists :
- idle_conns, which contains idling connections
- safe_conns, which contains idling connections that are safe to use even
for the first request
- available_conns, which contains connections that are not idling, but can
still accept new streams (those are HTTP/2 or fastcgi, and are always
considered safe).

5 years agoMEDIUM: sessions: Don't be responsible for connections anymore.
Olivier Houchard [Mon, 20 Jan 2020 12:56:01 +0000 (13:56 +0100)] 
MEDIUM: sessions: Don't be responsible for connections anymore.

Make it so sessions are not responsible for connection anymore, except for
connections that are private, and thus can't be shared, otherwise, as soon
as a request is done, the session will just add the connection to the
orphan connections pool.
This will break http-reuse safe, but it is expected to be fixed later.

5 years agoMINOR: ssl/cli: show certificate status in 'show ssl cert'
William Lallemand [Thu, 19 Mar 2020 19:26:02 +0000 (20:26 +0100)] 
MINOR: ssl/cli: show certificate status in 'show ssl cert'

Display the status of the certificate in 'show ssl cert'.

Example:

  Status: Empty
  Status: Unused
  Status: Used

5 years agoMINOR: ssl/cli: 'new ssl cert' command
William Lallemand [Thu, 19 Mar 2020 15:48:33 +0000 (16:48 +0100)] 
MINOR: ssl/cli: 'new ssl cert' command

The CLI command "new ssl cert" allows one to create a new certificate
store in memory. It can be filed with "set ssl cert" and "commit ssl
cert".

This patch also made a small change in "show ssl cert" to handle an
empty certificate store.

Multi-certificate bundles are not supported since they will probably be
removed soon.

This feature alone is useless since there is no way to associate the
store to a crt-list yet.

Example:

  $ echo "new ssl cert foobar.pem" | socat /tmp/sock1 -
  New empty certificate store 'foobar.pem'!
  $ printf "set ssl cert foobar.pem <<\n$(cat localhost.pem.rsa)\n\n" | socat /tmp/sock1 -
  Transaction created for certificate foobar.pem!
  $ echo "commit ssl cert foobar.pem" | socat /tmp/sock1 -
  Committing foobar.pem
  Success!
  $ echo "show ssl cert foobar.pem" | socat /tmp/sock1 -
  Filename: foobar.pem
  [...]

5 years agoMINOR: memory: Change the flush_lock to a spinlock, and don't get it in alloc.
Olivier Houchard [Wed, 18 Mar 2020 14:48:29 +0000 (15:48 +0100)] 
MINOR: memory: Change the flush_lock to a spinlock, and don't get it in alloc.

The flush_lock was introduced, mostly to be sure that pool_gc() will never
dereference a pointer that has been free'd. __pool_get_first() was acquiring
the lock to, the fear was that otherwise that pointer could get free'd later,
and then pool_gc() would attempt to dereference it. However, that can not
happen, because the only functions that can free a pointer, when using
lockless pools, are pool_gc() and pool_flush(), and as long as those two
are mutually exclusive, nobody will be able to free the pointer while
pool_gc() attempts to access it.
So change the flush_lock to a spinlock, and don't bother acquire/release
it in __pool_get_first(), that way callers of __pool_get_first() won't have
to wait while the pool is flushed. The worst that can happen is we call
__pool_refill_alloc() while the pool is getting flushed, and memory can
get allocated just to be free'd.

This may help with github issue #552

This may be backported to 2.1, 2.0 and 1.9.

5 years agoBUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue().
Olivier Houchard [Wed, 18 Mar 2020 12:10:05 +0000 (13:10 +0100)] 
BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue().

When running __signal_process_queue(), we ignore most signals. We can't,
however, ignore WDTSIG and DEBUGSIG, otherwise that thread may end up
waiting for another one that could hold a glibc lock, while the other thread
wait for this one to enter debug_handler().
So make sure WDTSIG and DEBUGSIG aren't ignored, if they are defined.
This probably explains the watchdog deadlock described in github issue

This should be backported to 2.1, 2.0 and 1.9.

5 years agoMINOR: wdt: Move the definitions of WDTSIG and DEBUGSIG into types/signal.h.
Olivier Houchard [Wed, 18 Mar 2020 12:07:19 +0000 (13:07 +0100)] 
MINOR: wdt: Move the definitions of WDTSIG and DEBUGSIG into types/signal.h.

Move the definition of WDTSIG and DEBUGSIG from wdt.c and debug.c into
types/signal.h, so that we can access them in another file.
We need those definition to avoid blocking those signals when running
__signal_process_queue().

This should be backported to 2.1, 2.0 and 1.9.

5 years agoDOC: assorted typo fixes in the documentation
Ilya Shipitsin [Sat, 14 Mar 2020 12:47:28 +0000 (17:47 +0500)] 
DOC: assorted typo fixes in the documentation

This is the fourth round of cleanups in various docs

5 years agoCI: travis: proper group output redirection together with travis_wait
Ilya Shipitsin [Tue, 17 Mar 2020 15:57:25 +0000 (20:57 +0500)] 
CI: travis: proper group output redirection together with travis_wait

travis_wait is bash function, it was wrongly grouped with output
redirection which leads to ARM64 builds errors last week

5 years agoCI: travis: re-enable ASAN on clang
Willy Tarreau [Wed, 18 Mar 2020 08:35:58 +0000 (09:35 +0100)] 
CI: travis: re-enable ASAN on clang

As spotted by Tim, ASAN is disabled on clang-9 due to an exact compiler
name match. Let's relax the rule and accept "clang" and "clang-*". More
context here: https://www.mail-archive.com/haproxy@formilux.org/msg36688.html

5 years agoBUILD: makefile: fix expression again to detect ARM platform
Willy Tarreau [Wed, 18 Mar 2020 07:20:45 +0000 (08:20 +0100)] 
BUILD: makefile: fix expression again to detect ARM platform

I messed up the fix in 67b095e ("BUILD: makefile: fix regex syntax in
ARM platform detection"), I tried it by hand in the shell without "-v"
but left it in the expression. It works on ARM because it only finds
lines starting with '#' but on other platforms it insists for -latomic.

5 years agoBUG/MINOR: pattern: Do not pass len = 0 to calloc()
Tim Duesterhus [Tue, 17 Mar 2020 20:08:24 +0000 (21:08 +0100)] 
BUG/MINOR: pattern: Do not pass len = 0 to calloc()

The behavior of calloc() when being passed `0` as `nelem` is implementation
defined. It may return a NULL pointer.

Avoid this issue by checking before allocating. While doing so adjust the local
integer variables that are used to refer to memory offsets to `size_t`.

This issue was introced in commit f91ac19299fe216a793ba6550dca06b688b31549. This
patch should be backported together with that commit.

5 years agoBUG/MINOR: ssl: memleak of struct crtlist_entry
William Lallemand [Tue, 17 Mar 2020 19:11:41 +0000 (20:11 +0100)] 
BUG/MINOR: ssl: memleak of struct crtlist_entry

There is a memleak of the entry structure in crtlist_load_cert_dir(), in
the case we can't stat the file, or this is not a regular file. Let's
move the entry allocation so it's done after these tests.

Fix issue #551.

5 years agoMINOR: tasks: Provide the tasklet to the callback.
Olivier Houchard [Tue, 17 Mar 2020 17:15:04 +0000 (18:15 +0100)] 
MINOR: tasks: Provide the tasklet to the callback.

When tasklet were introduced, it has been decided not to provide the tasklet
to the callback, but NULL instead. While it may have been reasonable back
then, maybe to be able to differentiate a task from a tasklet from the
callback, it also means that we can't access the tasklet from the handler if
the context provided can't be trusted.
As no handler is shared between a task and a tasklet, and there are now
other means of distinguishing between task and tasklet, just pass the
tasklet pointer too.

This may be backported to 2.1, 2.0 and 1.9 if needed.

5 years agoBUG/MINOR: ssl: memory leak in crtlist_parse_file()
William Lallemand [Tue, 17 Mar 2020 15:53:27 +0000 (16:53 +0100)] 
BUG/MINOR: ssl: memory leak in crtlist_parse_file()

A memory leak happens in an error case when ckchs_load_cert_file()
returns NULL in crtlist_parse_file().

This bug was introduced by commit 2954c47 ("MEDIUM: ssl: allow crt-list caching")

This patch fixes bug #551.

5 years agoMEDIUM: fd: Introduce a running mask, and use it instead of the spinlock.
Olivier Houchard [Thu, 27 Feb 2020 16:26:13 +0000 (17:26 +0100)] 
MEDIUM: fd: Introduce a running mask, and use it instead of the spinlock.

In the struct fdtab, introduce a new mask, running_mask. Each thread should
add its bit before using the fd.
Use the running_mask instead of a lock, in fd_insert/fd_delete, we'll just
spin as long as the mask is non-zero, to be sure we access the data
exclusively.
fd_set_running_excl() spins until the mask is 0, fd_set_running() just
adds the thread bit, and fd_clr_running() removes it.

5 years agoBUG/MINOR: ssl/cli: free the trash chunk in dump_crtlist
William Lallemand [Tue, 17 Mar 2020 14:13:11 +0000 (15:13 +0100)] 
BUG/MINOR: ssl/cli: free the trash chunk in dump_crtlist

Free the trash chunk after dumping the crt-lists.

Introduced by a6ffd5b ("MINOR: ssl/cli: show/dump ssl crt-list").

5 years agoMINOR: ssl/cli: show/dump ssl crt-list
William Lallemand [Mon, 9 Mar 2020 12:35:19 +0000 (13:35 +0100)] 
MINOR: ssl/cli: show/dump ssl crt-list

Implement 2 new commands on the CLI:

show ssl crt-list [<filename>]: Without a specified filename, display
the list of crt-lists used by the configuration. If a filename is
specified, it will displays the content of this crt-list, with a line
identifier at the beginning of each line. This output must not be used
as a crt-list file.

dump ssl crt-list <filename>: Dump the content of a crt-list, the output
can be used as a crt-list file.

Note: It currently displays the default ssl-min-ver and ssl-max-ver
which are potentialy not in the original file.

5 years agoMINOR: mux_pt: Don't try to remove the connection from the idle list.
Olivier Houchard [Tue, 10 Mar 2020 17:01:25 +0000 (18:01 +0100)] 
MINOR: mux_pt: Don't try to remove the connection from the idle list.

Don't bother trying to remove the connection from the idle list, as the
only connections the mux_pt handles are now the TCP-mode connections, and
those are never added to the idle list.

5 years agoMINOR: fd: Use a separate lock for logs instead of abusing the fd lock.
Olivier Houchard [Thu, 27 Feb 2020 16:25:43 +0000 (17:25 +0100)] 
MINOR: fd: Use a separate lock for logs instead of abusing the fd lock.

Introduce a new spinlock, log_lock, and use it instead of abusing the FD lock.

5 years agoBUG/MEDIUM: spoe: dup agent's engine_id string from trash.area
Kevin Zhu [Fri, 13 Mar 2020 02:39:51 +0000 (10:39 +0800)] 
BUG/MEDIUM: spoe: dup agent's engine_id string from trash.area

The agent's engine_id forgot to dup from trash, all engine_ids point to
the same address "&trash.area", the engine_id changed at run time and will
double free when release agents and trash.

This bug was introduced by the commit ee3bcddef ("MINOR: tools: add a generic
function to generate UUIDs").

No backport is needed, this is 2.2-dev.

5 years agoBUG/MINOR: ssl: can't open directories anymore
William Lallemand [Mon, 16 Mar 2020 16:21:51 +0000 (17:21 +0100)] 
BUG/MINOR: ssl: can't open directories anymore

The commit 6be66ec ("MINOR: ssl: directories are loaded like crt-list")
broke the directory loading of the certificates. The <crtlist> wasn't
filled by the crtlist_load_cert_dir() function. And the entries were
not correctly initialized. Leading to a segfault during startup.

5 years agoMINOR: ssl: directories are loaded like crt-list
William Lallemand [Fri, 6 Mar 2020 21:26:32 +0000 (22:26 +0100)] 
MINOR: ssl: directories are loaded like crt-list

Generate a directory cache with the crtlist and crtlist_entry structures.

With this new model, directories are a special case of the crt-lists.
A directory is a crt-list which allows only one occurence of each file,
without SSL configuration (ssl_bind_conf) and without filters.

5 years agoMEDIUM: ssl: allow crt-list caching
William Lallemand [Fri, 6 Mar 2020 20:54:13 +0000 (21:54 +0100)] 
MEDIUM: ssl: allow crt-list caching

The crtlist structure defines a crt-list in the HAProxy configuration.
It contains crtlist_entry structures which are the lines in a crt-list
file.

crt-list are now loaded in memory using crtlist and crtlist_entry
structures. The file is read only once. The generation algorithm changed
a little bit, new ckch instances are generated from the crtlist
structures, instead of being generated during the file loading.

The loading function was split in two, one that loads and caches the
crt-list and certificates, and one that looks for a crt-list and creates
the ckch instances.

Filters are also stored in crtlist_entry->filters as a char ** so we can
generate the sni_ctx again if needed. I won't be needed anymore to parse
the sni_ctx to do that.

A crtlist_entry stores the list of all ckch_inst that were generated
from this entry.

5 years agoMINOR: ssl: pass ckch_inst to ssl_sock_load_ckchs()
William Lallemand [Mon, 9 Mar 2020 15:48:43 +0000 (16:48 +0100)] 
MINOR: ssl: pass ckch_inst to ssl_sock_load_ckchs()

Pass a pointer to the struct ckch_inst to the ssl_sock_load_ckchs()
function so we can manipulate the ckch_inst from
ssl_sock_load_cert_list_file() and ssl_sock_load_cert().

5 years agoREORG: ssl: move ssl_sock_load_cert()
William Lallemand [Mon, 16 Mar 2020 13:45:55 +0000 (14:45 +0100)] 
REORG: ssl: move ssl_sock_load_cert()

Move the ssl_sock_load_cert() at the right place.

5 years agoBUG/MEDIUM: peers: resync ended with RESYNC_PARTIAL in wrong cases.
Emeric Brun [Mon, 16 Mar 2020 09:51:01 +0000 (10:51 +0100)] 
BUG/MEDIUM: peers: resync ended with RESYNC_PARTIAL in wrong cases.

This bug was introduced with peers.c code re-work (7d0ceeec80):
"struct peer" flags are mistakenly checked instead of
"struct peers" flags to check the resync status of the local peer.

The issue was reported here:
   https://github.com/haproxy/haproxy/issues/545

This bug affects all branches >= 2.0 and should be backported.

5 years agoBUILD: makefile: fix regex syntax in ARM platform detection
Willy Tarreau [Mon, 16 Mar 2020 08:38:00 +0000 (09:38 +0100)] 
BUILD: makefile: fix regex syntax in ARM platform detection

Commit d93e6ec ("BUILD: on ARM, must be linked to libatomic.") broke the
build due to a missing backslash in front of the '#':

  Makefile:331: *** invalid syntax in conditional.  Stop.

Let's address this and make sure we only pick relevant lines (and not
possibly empty lines).

5 years agoBUILD: on ARM, must be linked to libatomic.
David Carlier [Sun, 15 Mar 2020 10:30:51 +0000 (10:30 +0000)] 
BUILD: on ARM, must be linked to libatomic.

For load/store operations, needs to be linked to.
tested on raspberry.

5 years agoCI: travis: revert to clang-7 for BoringSSL tests
Willy Tarreau [Mon, 16 Mar 2020 07:10:56 +0000 (08:10 +0100)] 
CI: travis: revert to clang-7 for BoringSSL tests

Building BoringSSL with clang9 fails:
   https://travis-ci.com/github/haproxy/haproxy/jobs/298267505
   https://bugs.chromium.org/p/boringssl/issues/detail?id=323

Let's revert to clang-7 for now.

5 years agoCLEANUP: connection: Stop directly setting an ist's .ptr
Tim Duesterhus [Sat, 14 Mar 2020 12:07:05 +0000 (13:07 +0100)] 
CLEANUP: connection: Stop directly setting an ist's .ptr

Instead replace the complete `ist` by the value returned from `ist2`.

This was noticed during review of issue #549.

5 years agoBUILD: pools: silence build warnings with DEBUG_MEMORY_POOLS and DEBUG_UAF
Willy Tarreau [Sat, 14 Mar 2020 10:08:16 +0000 (11:08 +0100)] 
BUILD: pools: silence build warnings with DEBUG_MEMORY_POOLS and DEBUG_UAF

With these debug options we still get these warnings:

include/common/memory.h:501:23: warning: null pointer dereference [-Wnull-dereference]
    *(volatile int *)0 = 0;
    ~~~~~~~~~~~~~~~~~~~^~~
include/common/memory.h:460:22: warning: null pointer dereference [-Wnull-dereference]
   *(volatile int *)0 = 0;
   ~~~~~~~~~~~~~~~~~~~^~~

These are purposely there to crash the process at specific locations.
But the annoying warnings do not help with debugging and they are not
even reliable as the compiler may decide to optimize them away. Let's
pass the pointer through DISGUISE() to avoid this.

5 years agoMINOR: use DISGUISE() everywhere we deliberately want to ignore a result
Willy Tarreau [Sat, 14 Mar 2020 10:03:20 +0000 (11:03 +0100)] 
MINOR: use DISGUISE() everywhere we deliberately want to ignore a result

It's more generic and versatile than the previous shut_your_big_mouth_gcc()
that was used to silence annoying warnings as it's not limited to ignoring
syscalls returns only. This allows us to get rid of the aforementioned
function and the shut_your_big_mouth_gcc_int variable, that started to
look ugly in multi-threaded environments.

5 years agoMINOR: debug: consume the write() result in BUG_ON() to silence a warning
Willy Tarreau [Sat, 14 Mar 2020 09:58:35 +0000 (10:58 +0100)] 
MINOR: debug: consume the write() result in BUG_ON() to silence a warning

Tim reported that BUG_ON() issues warnings on his distro, as the libc marks
some syscalls with __attribute__((warn_unused_result)). Let's pass the
write() result through DISGUISE() to hide it.

5 years agoMINOR: debug: add a new DISGUISE() macro to pass a value as identity
Willy Tarreau [Sat, 14 Mar 2020 09:42:26 +0000 (10:42 +0100)] 
MINOR: debug: add a new DISGUISE() macro to pass a value as identity

This does exactly the same as ALREADY_CHECKED() but does it inline,
returning an identical copy of the scalar variable without letting
the compiler know how it might have been transformed. This can
forcefully disable certain null-pointer checks or result checks when
known undesirable. Typically forcing a crash with *(DISGUISE(NULL))=0
will not cause a null-deref warning.

5 years agoCI: travis: switch linux builds to clang-9
Ilya Shipitsin [Fri, 24 Jan 2020 06:36:41 +0000 (11:36 +0500)] 
CI: travis: switch linux builds to clang-9

let us use clang-9 instead of default clang-7 for linux builds.

5 years agoDOC: correct typo in alert message about rspirep
Balvinder Singh Rawat [Sat, 14 Mar 2020 06:41:50 +0000 (12:11 +0530)] 
DOC: correct typo in alert message about rspirep

This message comes when we run:
haproxy -c -V -f /etc/haproxy/haproxy.cfg
[ALERT] 072/233727 (30865) : parsing [/etc/haproxy/haproxy.cfg:34] : The 'rspirep' directive is not supported anymore sionce HAProxy 2.1. Use 'http-response replace-header' instead.
[ALERT] 072/233727 (30865) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
[ALERT] 072/233727 (30865) : Fatal errors found in configuration.