]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
3 years agoMINOR: pools: work around possibly slow malloc_trim() during gc
Willy Tarreau [Thu, 23 Dec 2021 08:26:30 +0000 (09:26 +0100)] 
MINOR: pools: work around possibly slow malloc_trim() during gc

During 2.4-dev, support for malloc_trim() was implemented to ease
release of memory in a stopping process. This was found to be quite
effective and later backported to 2.3.7.

Then it was found that sometimes malloc_trim() could take a huge time
to complete it if was competing with other threads still allocating and
releasing memory, reason why it was decided in 2.5-dev to move
malloc_trim() under the thread isolation that was already in place in
the shared pool version of pool_gc() (this was commit 26ed1835).

However, other instances of pool_gc() that used to call malloc_trim()
were not updated since they were not using thread isolation. Currently
we have two other such instances, one for when there is absolutely no
pool and one for when there are only thread-local pools.

Christian Ruppert reported in GH issue #1490 that he's sometimes seeing
and old process die upon reload when upgrading from 2.3 to 2.4, and
that this happens inside malloc_trim(). The problem is that since
2.4-dev11 with commit 0bae07592 we detect modern libc that provide a
faster thread-aware allocator and do not maintain shared pools anymore.
As such we're using again the simpler pool_gc() implementations that do
not use thread isolation around the malloc_trim() call.

All this code was cleaned up recently and the call moved to a new
function trim_all_pools(). This patch implements explicit thread isolation
inside that function so that callers do not have to care about this
anymore. The thread isolation is conditional so that this doesn't affect
the one already in place in the larger version of pool_gc(). This way it
will solve the problem for all callers.

This patch must be backported as far as 2.3. It may possibly require
some adaptations. If trim_all_pools() is not present, copy-pasting the
tests in each version of pool_gc() will have the same effect.

Thanks to Christian for his detailed report and his testing.

3 years agoMINOR: quic: Drop asap Retry or Version Negotiation packets
Frédéric Lécaille [Wed, 22 Dec 2021 19:39:12 +0000 (20:39 +0100)] 
MINOR: quic: Drop asap Retry or Version Negotiation packets

These packet are only sent by servers. We drop them as soon as possible
when we are an haproxy listener.

3 years agoMINOR: quic: xprt traces fixes
Frédéric Lécaille [Wed, 22 Dec 2021 16:40:38 +0000 (17:40 +0100)] 
MINOR: quic: xprt traces fixes

Empty parameters are permitted with TRACE_*() macros. If removed, must
be replaced by NULL.

3 years agoMINOR: quic: Handle the cases of overlapping STREAM frames
Frédéric Lécaille [Wed, 22 Dec 2021 15:13:43 +0000 (16:13 +0100)] 
MINOR: quic: Handle the cases of overlapping STREAM frames

This is the same treatment for bidi and uni STREAM frames. This is a duplication
code which should me remove building a function for both these types of streams.

3 years agoMINOR: quic: Wrong dropped packet skipping
Frédéric Lécaille [Wed, 22 Dec 2021 09:17:01 +0000 (10:17 +0100)] 
MINOR: quic: Wrong dropped packet skipping

There were cases where some dropped packets were not well skipped. This led
the low level QUIC packet parser to continue from wrong packet boundaries.

3 years agoMINOR: quic: unchecked qc_retrieve_conn_from_cid() returned value
Frédéric Lécaille [Tue, 21 Dec 2021 13:48:58 +0000 (14:48 +0100)] 
MINOR: quic: unchecked qc_retrieve_conn_from_cid() returned value

If qc_retrieve_conn_from_cid() did not manage to retrieve the connection
from packet CIDs, we must drop them.

3 years agoMINOR: quic: Add stream IDs to qcs_push_frame() traces
Frédéric Lécaille [Tue, 21 Dec 2021 10:53:33 +0000 (11:53 +0100)] 
MINOR: quic: Add stream IDs to qcs_push_frame() traces

This is only for debug purpose.

3 years agoMINOR: quic: add quic_conn instance in traces for qc_new_conn
Amaury Denoyelle [Tue, 21 Dec 2021 13:51:56 +0000 (14:51 +0100)] 
MINOR: quic: add quic_conn instance in traces for qc_new_conn

The connection instance has been replaced by a quic_conn as first
argument to QUIC traces. It is possible to report the quic_conn instance
in the qc_new_conn(), contrary to the connection which is not
initialized at this stage.

3 years agoMINOR: quic: use quic_conn as argument to traces
Amaury Denoyelle [Tue, 21 Dec 2021 13:29:15 +0000 (14:29 +0100)] 
MINOR: quic: use quic_conn as argument to traces

Replace the connection instance for first argument of trace callback by
a quic_conn instance. The QUIC trace module is properly initialized with
the first argument refering to a quic_conn.

Replace every connection instances in TRACE_* macros invocation in
xprt-quic by its related quic_conn. In some case, the connection is
still used to access the quic_conn. It may cause some problem on the
future when the connection will be completly separated from the xprt
layer.

This commit is part of the rearchitecture of xprt-quic layers and the
separation between xprt and connection instances.

3 years agoMINOR: trace: add quic_conn argument definition
Amaury Denoyelle [Tue, 21 Dec 2021 10:26:02 +0000 (11:26 +0100)] 
MINOR: trace: add quic_conn argument definition

Prepare trace support for quic_conn instances as argument. This will be
used by the xprt-quic layer in replacement of the connection.

This commit is part of the rearchitecture of xprt-quic layers and the
separation between xprt and connection instances.

3 years agoMINOR: quic: add const qualifier for traces function
Amaury Denoyelle [Tue, 21 Dec 2021 13:28:26 +0000 (14:28 +0100)] 
MINOR: quic: add const qualifier for traces function

Add const qualifier on arguments of several dump functions used in the
trace callback. This is required to be able to replace the first trace
argument by a quic_conn instance. The first argument is a const pointer
and so the members accessed through it must also be const.

3 years agoMINOR: quic: add reference to quic_conn in ssl context
Amaury Denoyelle [Tue, 21 Dec 2021 10:41:52 +0000 (11:41 +0100)] 
MINOR: quic: add reference to quic_conn in ssl context

Add a new member in ssl_sock_ctx structure to reference the quic_conn
instance if used in the QUIC stack. This member is initialized during
qc_conn_init().

This is needed to be able to access to the quic_conn without relying on
the connection instance. This commit is part of the rearchitecture of
xprt-quic layers and the separation between xprt and connection
instances.

3 years agoREORG: quic: move mux function outside of xprt
Amaury Denoyelle [Tue, 21 Dec 2021 10:53:10 +0000 (11:53 +0100)] 
REORG: quic: move mux function outside of xprt

Move qcc_get_qcs() function from xprt_quic.c to mux_quic.c. This
function is used to retrieve the qcs instance from a qcc with a stream
id. This clearly belongs to the mux-quic layer.

3 years agoCLEANUP: quic: rename quic_conn instances to qc
Amaury Denoyelle [Tue, 21 Dec 2021 13:45:39 +0000 (14:45 +0100)] 
CLEANUP: quic: rename quic_conn instances to qc

Use the convention of naming quic_conn instance as qc to not confuse it
with a connection instance. The changes occured for qc_parse_pkt_frms(),
qc_build_frms() and qc_do_build_pkt().

3 years agoDOC: fix misspelled keyword "resolve_retries" in resolvers
Thierry Fournier [Wed, 15 Dec 2021 18:03:52 +0000 (19:03 +0100)] 
DOC: fix misspelled keyword "resolve_retries" in resolvers

"resolve_retries" was spelled "resolve_retires".

3 years agoMINOR: quic: Wrong packet refcount handling in qc_pkt_insert()
Frédéric Lécaille [Mon, 20 Dec 2021 13:41:19 +0000 (14:41 +0100)] 
MINOR: quic: Wrong packet refcount handling in qc_pkt_insert()

The QUIC connection I/O handler qc_conn_io_cb() could be called just after
qc_pkt_insert() have inserted a packet in a its tree, and before qc_pkt_insert()
have incremented the reference counter to this packet. As qc_conn_io_cb()
decrement this counter, the packet could be released before qc_pkt_insert()
might increment the counter, leading to possible crashes when trying to do so.
So, let's make qc_pkt_insert() increment this counter before inserting the packet
it is tree. No need to lock anything for that.

3 years agoMINOR: quic: Do not forget STREAM frames received in disorder
Frédéric Lécaille [Mon, 20 Dec 2021 11:02:13 +0000 (12:02 +0100)] 
MINOR: quic: Do not forget STREAM frames received in disorder

Add a function to process all STREAM frames received and ordered
by their offset (qc_treat_rx_strm_frms()) and modify
qc_handle_bidi_strm_frm() consequently.

3 years agoMINOR: quic: Do not expect to receive only one O-RTT packet
Frédéric Lécaille [Fri, 17 Dec 2021 17:24:16 +0000 (18:24 +0100)] 
MINOR: quic: Do not expect to receive only one O-RTT packet

There is nothing about this in the RFC. We must support to receive
several 0-RTT packets before the handshake has completed.

3 years agoMINOR: quic: Stop emptying the RX buffer asap.
Frédéric Lécaille [Mon, 20 Dec 2021 16:12:42 +0000 (17:12 +0100)] 
MINOR: quic: Stop emptying the RX buffer asap.

When a packet is present in the RX buffer at the first place
but without a null reference counter, there is no need to continue
to try to empty the buffer, it is sure the next packet will not
be at the first place!

3 years agoMINOR: quic: Add a function to list remaining RX packets by encryption level
Frédéric Lécaille [Fri, 17 Dec 2021 15:11:54 +0000 (16:11 +0100)] 
MINOR: quic: Add a function to list remaining RX packets by encryption level

This is only to debug some issues which cause the RX buffer saturation
with "Too big packet" traces.

3 years agoMINOR: quic: Increase the RX buffer for each connection
Frédéric Lécaille [Fri, 17 Dec 2021 13:11:00 +0000 (14:11 +0100)] 
MINOR: quic: Increase the RX buffer for each connection

Double this buffer size which reaches 16ko for now on.

3 years agoMINOR: ssl: Remove empty lines from "show ssl ocsp-response" output
Remi Tricot-Le Breton [Fri, 17 Dec 2021 17:53:23 +0000 (18:53 +0100)] 
MINOR: ssl: Remove empty lines from "show ssl ocsp-response" output

There were empty lines in the output of the CLI's "show ssl
ocsp-response" command (after the certificate ID and between two
certificates). This patch removes them since an empty line should mark
the end of the output.

Must be backported in 2.5.

3 years agoREGTESTS: vars: Remove useless ssl tunes from conditional set-var test
Remi Tricot-Le Breton [Mon, 20 Dec 2021 09:52:58 +0000 (10:52 +0100)] 
REGTESTS: vars: Remove useless ssl tunes from conditional set-var test

The global section of the cond_set_var.vtc test used some useless SSL
tunes which made the test fail on builds without SSL.

3 years agoMINOR: quic: simplify the removal from ODCID tree
Amaury Denoyelle [Thu, 16 Dec 2021 15:15:18 +0000 (16:15 +0100)] 
MINOR: quic: simplify the removal from ODCID tree

With the DCID refactoring, the locking is more centralized. It is
possible to simplify the code for removal of a quic_conn from the ODCID
tree.

This operation can be conducted as soon as the connection has been
retrieved from the DCID tree, meaning that the peer now uses the final
DCID. Remove the bit to flag a connection for removal and just uses
ebmb_delete() on each sucessful lookup on the DCID tree. If the
quic_conn has already been removed, it is just a noop thanks to
eb_delete() implementation.

3 years agoMINOR: quic: refactor DCID lookup
Amaury Denoyelle [Wed, 15 Dec 2021 15:32:56 +0000 (16:32 +0100)] 
MINOR: quic: refactor DCID lookup

A new function named qc_retrieve_conn_from_cid() now contains all the
code to retrieve a connection from a DCID. It handle all type of packets
and centralize the locking on the ODCID/DCID trees.

This simplify the qc_lstnr_pkt_rcv() function.

3 years agoMINOR: quic: compare coalesced packets by DCID
Amaury Denoyelle [Tue, 14 Dec 2021 14:04:14 +0000 (15:04 +0100)] 
MINOR: quic: compare coalesced packets by DCID

If an UDP datagram contains multiple QUIC packets, they must all use the
same DCID. The datagram context is used partly for this.

To ensure this, a comparison was made on the dcid_node of DCID tree. As
this is a comparison based on pointer address, it can be faulty when
nodes are removed/readded on the same pointer address.

Replace this comparison by a proper comparison on the DCID data itself.
To this end, the dgram_ctx structure contains now a quic_cid member.

3 years agoMINOR: quic: refactor concat DCID with address for Initial packets
Amaury Denoyelle [Tue, 14 Dec 2021 16:20:59 +0000 (17:20 +0100)] 
MINOR: quic: refactor concat DCID with address for Initial packets

For first Initial packets, the socket source dest address is
concatenated to the DCID. This is used to be able to differentiate
possible collision between several clients which used the same ODCID.

Refactor the code to manage DCID and the concatenation with the address.
Before this, the concatenation was done on the quic_cid struct and its
<len> field incremented. In the code it is difficult to differentiate a
normal DCID with a DCID + address concatenated.

A new field <addrlen> has been added in the quic_cid struct. The <len>
field now only contains the size of the QUIC DCID. the <addrlen> is
first initialized to 0. If the address is concatenated, it will be
updated with the size of the concatenated address. This now means we
have to explicitely used either cid.len or cid.len + cid.addrlen to
access the DCID or the DCID + the address. The code should be clearer
thanks to this.

The field <odcid_len> in quic_rx_packet struct is now useless and has
been removed. However, a new parameter must be added to the
qc_new_conn() function to specify the size of the ODCID addrlen.

3 years agoMINOR: quic: rename constant for haproxy CIDs length
Amaury Denoyelle [Tue, 14 Dec 2021 16:17:28 +0000 (17:17 +0100)] 
MINOR: quic: rename constant for haproxy CIDs length

On haproxy implementation, generated DCID are on 8 bytes, the minimal
value allowed by the specification. Rename the constant representing
this size to inform that this is haproxy specific.

3 years agoMINOR: quic: add missing lock on cid tree
Amaury Denoyelle [Mon, 13 Dec 2021 16:07:55 +0000 (17:07 +0100)] 
MINOR: quic: add missing lock on cid tree

All operation on the ODCID/DCID trees must be conducted under a
read-write lock. Add a missing read-lock on the lookup operation inside
listener handler.

3 years agoCLEANUP: quic: rename quic_conn conn to qc in quic_conn_free
Amaury Denoyelle [Mon, 13 Dec 2021 16:07:03 +0000 (17:07 +0100)] 
CLEANUP: quic: rename quic_conn conn to qc in quic_conn_free

Rename quic_conn from conn to qc to differentiate it from a struct
connection instance. This convention is already used in the majority of
the code.

3 years agoCLEANUP: quic: fix spelling mistake in a trace
Amaury Denoyelle [Fri, 17 Dec 2021 09:58:05 +0000 (10:58 +0100)] 
CLEANUP: quic: fix spelling mistake in a trace

Initiial -> Initial

3 years agoMINOR: mux-quic: fix trace on stream creation
Amaury Denoyelle [Thu, 16 Dec 2021 14:22:30 +0000 (15:22 +0100)] 
MINOR: mux-quic: fix trace on stream creation

Replace non-initialized qcs.by_id.key by the id to report the proper
stream ID on stream creation.

3 years agoCLEANUP: quic: Shorten a litte bit the traces in lstnr_rcv_pkt()
Frédéric Lécaille [Thu, 16 Dec 2021 17:03:52 +0000 (18:03 +0100)] 
CLEANUP: quic: Shorten a litte bit the traces in lstnr_rcv_pkt()

Some traces were too long and confusing when displaying 0 for a non-already
parsed packet number.

3 years agoMINOR: quic: Do not mix packet number space and connection flags
Frédéric Lécaille [Thu, 16 Dec 2021 10:21:52 +0000 (11:21 +0100)] 
MINOR: quic: Do not mix packet number space and connection flags

The packet number space flags were mixed with the connection level flags.
This leaded to ACK to be sent at the connection level without regard to
the underlying packet number space. But we want to be able to acknowleged
packets for a specific packet number space.

3 years agoMINOR: hq_interop: Stop BUG_ON() truncated streams
Frédéric Lécaille [Wed, 15 Dec 2021 21:38:48 +0000 (22:38 +0100)] 
MINOR: hq_interop: Stop BUG_ON() truncated streams

This is required if we do not want to make haproxy crash during zerortt
interop runner test which makes a client open multiple streams with
long request paths.

3 years agoCLEANUP: quic: Comment fix for qc_strm_cpy()
Frédéric Lécaille [Wed, 15 Dec 2021 14:32:55 +0000 (15:32 +0100)] 
CLEANUP: quic: Comment fix for qc_strm_cpy()

This function never returns a negative value... hopefully because it returns
a size_t!!!

3 years agoMINOR: qpack: Missing check for truncated QPACK fields
Frédéric Lécaille [Wed, 15 Dec 2021 13:16:16 +0000 (14:16 +0100)] 
MINOR: qpack: Missing check for truncated QPACK fields

Decrementing <len> variable without checking could make haproxy crash (on abort)
when printing a huge buffer (with negative length).

3 years agoMINOR: quic: Make xprt support 0-RTT.
Frédéric Lécaille [Tue, 14 Dec 2021 18:44:14 +0000 (19:44 +0100)] 
MINOR: quic: Make xprt support 0-RTT.

A client sends a 0-RTT data packet after an Initial one in the same datagram.
We must be able to parse such packets just after having parsed the Initial packets.

3 years agoMINOR: ssl_sock: Set the QUIC application from ssl_sock_advertise_alpn_protos.
Frédéric Lécaille [Tue, 14 Dec 2021 18:40:04 +0000 (19:40 +0100)] 
MINOR: ssl_sock: Set the QUIC application from ssl_sock_advertise_alpn_protos.

Make this function call quic_set_app_ops() if the protocol could be negotiated
by the TLS stack.

3 years agoMINOR: quic: Add quic_set_app_ops() function
Frédéric Lécaille [Tue, 14 Dec 2021 18:34:08 +0000 (19:34 +0100)] 
MINOR: quic: Add quic_set_app_ops() function

Export the code responsible which set the ->app_ops structure into
quic_set_app_ops() function. It must be called by  the TLS callback which
selects the application (ssl_sock_advertise_alpn_protos) so that
to be able to build application packets after having received 0-RTT data.

3 years agoMINOR: quic: No TX secret at EARLY_DATA encryption level
Frédéric Lécaille [Tue, 14 Dec 2021 18:29:34 +0000 (19:29 +0100)] 
MINOR: quic: No TX secret at EARLY_DATA encryption level

The TLS does not provide us with TX secrets after we have provided it
with 0-RTT data. This is logic: the server does not need to send 0-RTT
data. We must skip the section where such secrets are derived if we do not
want to close the connection with a TLS alert.

3 years agoMINOR: quic: Enable TLS 0-RTT if needed
Frédéric Lécaille [Tue, 14 Dec 2021 18:23:43 +0000 (19:23 +0100)] 
MINOR: quic: Enable TLS 0-RTT if needed

Enable 0-RTT at the TLS context level:
    RFC 9001 4.6.1. Enabling 0-RTT
    Accordingly, the max_early_data_size parameter is repurposed to hold a
    sentinel value 0xffffffff to indicate that the server is willing to accept
    QUIC 0-RTT data.
At the SSL connection level, we must call SSL_set_quic_early_data_enabled().

3 years agoCLEANUP: quic: Remove cdata_len from quic_tx_packet struct
Frédéric Lécaille [Mon, 13 Dec 2021 11:30:54 +0000 (12:30 +0100)] 
CLEANUP: quic: Remove cdata_len from quic_tx_packet struct

This field is no more useful. Modify the traces consequently.
Also initialize ->pn_node.key value to -1, which is an illegal value
for QUIC packet number, and display it in traces if different from -1.

3 years agoMINOR: quic: Add traces for STOP_SENDING frame and modify others
Frédéric Lécaille [Fri, 10 Dec 2021 14:18:36 +0000 (15:18 +0100)] 
MINOR: quic: Add traces for STOP_SENDING frame and modify others

If not handled by qc_parse_pkt_frms(), the packet which contains it is dropped.
Add only a trace when parsing this frame at this time.
Also modify others to reduce the traces size and have more information about streams.

3 years agoCLEANUP: quic_frame: Remove a useless suffix to STOP_SENDING
Frédéric Lécaille [Fri, 10 Dec 2021 13:42:02 +0000 (14:42 +0100)] 
CLEANUP: quic_frame: Remove a useless suffix to STOP_SENDING

This is to be consistent with the other frame names. Adding a _frame
suffixe to STOP_SENDING is useless. We know this is a frame.

3 years agoMINOR: quic: Attach timer task to thread for the connection.
Frédéric Lécaille [Thu, 9 Dec 2021 09:06:21 +0000 (10:06 +0100)] 
MINOR: quic: Attach timer task to thread for the connection.

This is to avoid races between the connection I/O handler and this task
which share too much variables.

3 years agoREGTESTS: vars: Add new test for conditional set-var
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:41 +0000 (17:14 +0100)] 
REGTESTS: vars: Add new test for conditional set-var

This regtest uses the newly created conditions that can be added to
set-var converters or actions.

3 years agoDOC: vars: Add documentation about the set-var conditions
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:40 +0000 (17:14 +0100)] 
DOC: vars: Add documentation about the set-var conditions

The set-var converter as well as the http and tcp set-var actions can
now be given multiple conditions that need to all be true for the
variable's contents to actually be changed. Those conditions can concern
the variable as well as the input contents and can also work by
comparing the variable and the input values.

3 years agoMEDIUM: vars: Enable optional conditions to set-var converter and actions
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:39 +0000 (17:14 +0100)] 
MEDIUM: vars: Enable optional conditions to set-var converter and actions

This patch adds the possibility to add a set of conditions to a set-var
call, be it a converter or an action (http-request or http-response
action for instance). The conditions must all be true for the given
set-var call for the variable to actually be set. If any of the
conditions is false, the variable is left untouched.
The managed conditions are the following : "ifexists", "ifnotexists",
"ifempty", "ifnotempty", "ifset", "ifnotset", "ifgt", "iflt".  It is
possible to combine multiple conditions in a single set-var call since
some of them apply to the variable itself, and some others to the input.

This patch does not change the fact that variables of scope proc are
still created during configuration parsing, regardless of the conditions
that might be added to the set-var calls in which they are mentioned.
For instance, such a line :
    http-request set-var(proc.foo,ifexists) int(5)
would not prevent the creation of the variable during init, and when
actually reaching this line during runtime, the proc.foo variable would
already exist. This is specific to the proc scope.

These new conditions mean that a set-var could "fail" for other reasons
than memory allocation failures but without clearing the contents of the
variable.

3 years agoMINOR: vars: Parse optional conditions passed to the set-var actions
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:38 +0000 (17:14 +0100)] 
MINOR: vars: Parse optional conditions passed to the set-var actions

This patch adds the parsing of the optional condition parameters that
can be passed to the set-var and set-var-fmt actions (http as well as
tcp). Those conditions will not be taken into account yet in the var_set
function so conditions passed as parameters will not have any effect.
Since actions do not benefit from the parameter preparsing that
converters have, parsing conditions needed to be done by hand.

3 years agoMINOR: vars: Parse optional conditions passed to the set-var converter
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:37 +0000 (17:14 +0100)] 
MINOR: vars: Parse optional conditions passed to the set-var converter

This patch adds the parsing of the optional condition parameters that
can be passed to the set-var converter. Those conditions will not be
taken into account yet in the var_set function so conditions passed as
parameters will not have any effect. This is true for any condition
apart from the "ifexists" one that is also used to replace the
VF_UPDATEONLY flag that was used to prevent proc scope variable creation
from a LUA module.

3 years agoMINOR: vars: Delay variable content freeing in var_set function
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:36 +0000 (17:14 +0100)] 
MINOR: vars: Delay variable content freeing in var_set function

When calling var_set on a variable of type string (SMP_T_STR, SMP_T_BIN
or SMP_T_METH), the contents of the variable were freed directly. When
adding conditions to set-var calls we might have cases in which the
contents of an existing variable should be kept unchanged so the freeing
of the internal buffers is delayed in the var_set function (so that we
can bypass it later).

3 years agoMINOR: vars: Set variable type to ANY upon creation
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:35 +0000 (17:14 +0100)] 
MINOR: vars: Set variable type to ANY upon creation

The type of a newly created variable was not initialized. This patch
sets it to SMP_T_ANY by default. This will be required when conditions
can be added to a set-var call because we might end up creating a
variable without setting it yet.

3 years agoMINOR: vars: Move UPDATEONLY flag test to vars_set_ifexist
Remi Tricot-Le Breton [Thu, 16 Dec 2021 16:14:34 +0000 (17:14 +0100)] 
MINOR: vars: Move UPDATEONLY flag test to vars_set_ifexist

The vars_set_by_name_ifexist function was created to avoid creating too
many variables from a LUA module. This was made thanks to the
VF_UPDATEONLY flags which prevented variable creation in the var_set
function. Since commit 3a4bedccc ("MEDIUM: vars: replace the global name
index with a hash") this limitation was restricted to 'proc' scope
variables only.
This patch simply moves the scope test to the vars_set_by_name_ifexist
function instead of the var_set function.

3 years agoBUILD: ssl: unbreak the build with newer libressl
Daniel Jakots [Wed, 8 Dec 2021 01:34:39 +0000 (20:34 -0500)] 
BUILD: ssl: unbreak the build with newer libressl

In LibreSSL 3.5.0, BIO is going to become opaque, so haproxy's
compat macros will no longer work. The functions they substitute
have been available since LibreSSL 2.7.0.

3 years agoMEDIUM: cfgparse: numa detect topology on FreeBSD.
David CARLIER [Mon, 6 Dec 2021 11:00:10 +0000 (11:00 +0000)] 
MEDIUM: cfgparse: numa detect topology on FreeBSD.

allowing for all platforms supporting cpu affinity to have a chance
 to detect the cpu topology from a given valid node (e.g.
 DragonflyBSD seems to be NUMA aware from a kernel's perspective
 and seems to be willing start to provide userland means to get
 proper info).

3 years agoCLEANUP: cfgparse: modify preprocessor guards around numa detection code
Amaury Denoyelle [Wed, 15 Dec 2021 08:48:39 +0000 (09:48 +0100)] 
CLEANUP: cfgparse: modify preprocessor guards around numa detection code

numa_detect_topology() is always define now if USE_CPU_AFFINITY is
activated. For the moment, only on Linux an actual implementation is
provided. For other platforms, it always return 0.

This change has been made to easily add implementation of NUMA detection
for other platforms. The phrasing of the documentation has also been
edited to removed the mention of Linux-only on numa-cpu-mapping
configuration option.

3 years agoMINOR: cli: "show version" displays the current process version
William Lallemand [Tue, 14 Dec 2021 14:22:29 +0000 (15:22 +0100)] 
MINOR: cli: "show version" displays the current process version

This patch implements a simple "show version" command which returns
the version of the current process.

It's available from the master and the worker processes, so it is easy
to check if the master and the workers have the same version.

This is a minor patch that really improve compatibility checks
for scripts.

Could be backported in haproxy version as far as 2.0.

3 years agoREGTESTS: ssl: use X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY for cert check
Ilya Shipitsin [Sat, 4 Dec 2021 09:32:23 +0000 (14:32 +0500)] 
REGTESTS: ssl: use X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY for cert check

LibreSSL-3.4.2 introduced cert revocation check behaviour change, for some
checks now X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY (20) is returned.

https://github.com/libressl-portable/portable/issues/697

let us modify vtc accordingly

3 years agoMINOR: hq-interop: refix tx buffering
Amaury Denoyelle [Thu, 9 Dec 2021 09:07:23 +0000 (10:07 +0100)] 
MINOR: hq-interop: refix tx buffering

Incorrect usage of the buffer API : b_room() replaces b_size() to ensure
that we have enough size for http data copy.

3 years agoBUG/MEDIUM: mworker/cli: crash when trying to access an old PID in prompt mode
William Lallemand [Fri, 10 Dec 2021 13:14:53 +0000 (14:14 +0100)] 
BUG/MEDIUM: mworker/cli: crash when trying to access an old PID in prompt mode

The master process encounter a crash when trying to access an old
process which left from the master CLI.

To reproduce the problem, you need a prompt to a previous worker, then
wait for this worker to leave, once it left launch a command from this
prompt. The s->target is then filled with a NULL which is dereferenced
when trying to connect().

This patch fixes the problem by checking if s->target is NULL.

Must be backported as far as 2.0.

3 years agoDOC: config: fix error-log-format example
Lukas Tribus [Thu, 9 Dec 2021 00:27:14 +0000 (01:27 +0100)] 
DOC: config: fix error-log-format example

In commit 6f7497616 ("MEDIUM: connection: rename fc_conn_err and
bc_conn_err to fc_err and bc_err"), fc_conn_err became fc_err, so
update this example.

3 years agoDOC: config: retry-on list is space-delimited
Lukas Tribus [Wed, 8 Dec 2021 10:33:01 +0000 (11:33 +0100)] 
DOC: config: retry-on list is space-delimited

We are using comma-delimited list for init-addr for example, let's
document that this is space-delimited to avoid the guessing game.

3 years agoMINOR: h3: fix possible invalid dereference on htx parsing
Amaury Denoyelle [Wed, 8 Dec 2021 14:51:04 +0000 (15:51 +0100)] 
MINOR: h3: fix possible invalid dereference on htx parsing

The htx variable is only initialized if we have received a HTTP/3
HEADERS frame. Else it must not be dereferenced.

This should fix the compilation on CI with gcc.
  src/h3.c: In function ‘h3_decode_qcs’:
  src/h3.c:224:14: error: ‘htx’ may be used uninitialized in this function
  [-Werror=maybe-uninitialized]
    224 |   htx->flags |= HTX_FL_EOM

3 years agoMINOR: quic: Compilation fix for quic_rx_packet_refinc()
Frédéric Lécaille [Wed, 8 Dec 2021 14:24:15 +0000 (15:24 +0100)] 
MINOR: quic: Compilation fix for quic_rx_packet_refinc()

This was reported by the CI wich clang as compilator.

    In file included from src/ssl_sock.c:80:
    include/haproxy/xprt_quic.h:1100:50: error: passing 'int *' to parameter of
    type 'unsigned int *' converts between pointers to integer types with
    different sign [-Werror,-Wpointer-sign]
        } while (refcnt && !HA_ATOMIC_CAS(&pkt->refcnt, &refcnt, refcnt - 1));
                                                        ^~~~~~~

3 years agoBUG/MINOR: mux-quic: properly initialize flow control
Amaury Denoyelle [Wed, 8 Dec 2021 14:12:01 +0000 (15:12 +0100)] 
BUG/MINOR: mux-quic: properly initialize flow control

Initialize all flow control members on the qcc instance. Without this,
the value are undefined and it may be possible to have errors about
reached streams limit.

3 years agoMINOR: quic: notify the mux on CONNECTION_CLOSE
Amaury Denoyelle [Wed, 8 Dec 2021 13:51:04 +0000 (14:51 +0100)] 
MINOR: quic: notify the mux on CONNECTION_CLOSE

The xprt layer is reponsible to notify the mux of a CONNECTION_CLOSE
reception. In this case the flag QC_CF_CC_RECV is positionned on the
qcc and the mux tasklet is waken up.

One of the notable effect of the QC_CF_CC_RECV is that each qcs will be
released even if they have remaining data in their send buffers.

3 years agoMINOR: mux-quic: do not release qcs if there is remaining data to send
Amaury Denoyelle [Wed, 8 Dec 2021 13:42:55 +0000 (14:42 +0100)] 
MINOR: mux-quic: do not release qcs if there is remaining data to send

A qcs is not freed if there is remaining data in its buffer. In this
case, the flag QC_SF_DETACH is positionned.

The qcc io handler is responsible to remove the qcs if the QC_SF_DETACH
is set and their buffers are empty.

3 years agoBUG/MINOR: cli/server: Don't crash when a server is added with a custom id
Christopher Faulet [Tue, 7 Dec 2021 17:49:44 +0000 (18:49 +0100)] 
BUG/MINOR: cli/server: Don't crash when a server is added with a custom id

When a server is dynamically added via the CLI with a custom id, the key
used to insert it in the backend's tree of used names is not initialized.
The server id must be used but it is only used when no custom id is
provided. Thus, with a custom id, HAProxy crashes.

Now, the server id is always used to init this key, to be able to insert the
server in the corresponding tree.

This patch should fix the issue #1481. It must be backported as far as 2.4.

3 years agoMINOR: http-rules: Add capture action to http-after-response ruleset
Christopher Faulet [Mon, 6 Dec 2021 07:43:22 +0000 (08:43 +0100)] 
MINOR: http-rules: Add capture action to http-after-response ruleset

It is now possible to perform captures on the response when
http-after-response rules are evaluated. It may be handy to capture headers
from responses generated by HAProxy.

This patch is trivial, it may be backported if necessary.

3 years agoBUILD: mux-quic: fix compilation with DEBUG_MEM_STATS
Amaury Denoyelle [Tue, 7 Dec 2021 16:27:47 +0000 (17:27 +0100)] 
BUILD: mux-quic: fix compilation with DEBUG_MEM_STATS

Replace bug.h by api.h in mux_quic header.
This is required because bug.h uses atomic operations when compiled with
DEBUG_MEM_STATS. api.h takes care of including atomic.h before bug.h.

3 years agoMINOR: quic: add HTX EOM on request end
Amaury Denoyelle [Tue, 30 Nov 2021 10:23:29 +0000 (11:23 +0100)] 
MINOR: quic: add HTX EOM on request end

Set the HTX EOM flag on RX the app layer. This is required to notify
about the end of the request for the stream analyzers, else the request
channel never goes to MSG_DONE state.

3 years agoMINOR: mux-quic: remove uneeded code to check fin on TX
Amaury Denoyelle [Tue, 7 Dec 2021 15:50:14 +0000 (16:50 +0100)] 
MINOR: mux-quic: remove uneeded code to check fin on TX

Remove a wrong comparaison with the same buffer on both sides. In any
cases, the FIN is properly set by qcs_push_frame only when the payload
has been totally emptied.

3 years agoMINOR: hq-interop: fix tx buffering
Amaury Denoyelle [Tue, 7 Dec 2021 15:19:03 +0000 (16:19 +0100)] 
MINOR: hq-interop: fix tx buffering

On h09 app layer, if there is not enought size in the tx buffer, the
transfer is interrupted and the flag QC_SF_BLK_MROOM is positionned.
The transfer is woken up by the mux when new buffer size becomes
available.

This ensure that no data is silently discarded during transfer. Without
this, once the buffer is full the data were removed and thus not send to
the client resulting in a truncating payload.

3 years agoMINOR: quic: Remove QUIC TX packet length evaluation function
Frédéric Lécaille [Tue, 7 Dec 2021 14:27:44 +0000 (15:27 +0100)] 
MINOR: quic: Remove QUIC TX packet length evaluation function

Remove qc_eval_pkt() which has come with the multithreading support. It
was there to evaluate the length of a TX packet before building. We could
build from several thread TX packets without consuming a packet number for nothing (when
the building failed). But as the TX packet building functions are always
executed by the same thread, the one attached to the connection, this does
not make sense to continue to use such a function. Furthermore it is buggy
since we had to recently pad the TX packet under certain circumstances.

3 years agoMINOR: quic: Delete remaining RX handshake packets
Frédéric Lécaille [Mon, 6 Dec 2021 11:09:08 +0000 (12:09 +0100)] 
MINOR: quic: Delete remaining RX handshake packets

After the handshake has succeeded, we must delete any remaining
Initial or Handshake packets from the RX buffer. This cannot be
done depending on the state the connection (->st quic_conn struct
member value) as the packet are not received/treated in order.

3 years agoMINOR: quic: QUIC encryption level RX packets race issue
Frédéric Lécaille [Mon, 6 Dec 2021 07:56:38 +0000 (08:56 +0100)] 
MINOR: quic: QUIC encryption level RX packets race issue

The tree containing RX packets must be protected from concurrent accesses.

3 years agoMINOR: quic: Race issue when consuming RX packets buffer
Frédéric Lécaille [Thu, 2 Dec 2021 13:46:19 +0000 (14:46 +0100)] 
MINOR: quic: Race issue when consuming RX packets buffer

Add a null byte to the end of the RX buffer to notify the consumer there is no
more data to treat.
Modify quic_rx_packet_pool_purge() which is the function which remove the
RX packet from the buffer.
Also rename this function to quic_rx_pkts_del().
As the RX packets may be accessed by the QUIC connection handler (quic_conn_io_cb())
the function responsible of decrementing their reference counters must not
access other information than these reference counters! It was a very bad idea
to try to purge the RX buffer asap when executing this function.

3 years agoMINOR: quic: RX buffer full due to wrong CRYPTO data handling
Frédéric Lécaille [Thu, 2 Dec 2021 10:25:58 +0000 (11:25 +0100)] 
MINOR: quic: RX buffer full due to wrong CRYPTO data handling

Do not leave in the RX buffer packets with CRYPTO data which were
already received. We do this when parsing CRYPTO frame. If already
received we must not consider such frames as if they were not received
in order! This had as side effect to interrupt the transfer of long streams
(ACK frames not parsed).

3 years agoMEDIUM: mux-quic: handle when sending buffer is full
Amaury Denoyelle [Fri, 3 Dec 2021 13:40:01 +0000 (14:40 +0100)] 
MEDIUM: mux-quic: handle when sending buffer is full

Handle the case when the app layer sending buffer is full. A new flag
QC_SF_BLK_MROOM is set in this case and the transfer is interrupted. It
is expected that then the conn-stream layer will subscribe to SEND.

The MROOM flag is reset each time the muxer transfer data from the app
layer to its own buffer. If the app layer has been subscribed on SEND it
is woken up.

3 years agoMEDIUM: mux-quic: wake up xprt on data transferred
Amaury Denoyelle [Fri, 3 Dec 2021 13:39:29 +0000 (14:39 +0100)] 
MEDIUM: mux-quic: wake up xprt on data transferred

On qc_send, data are transferred for each stream from their qcs.buf to
the qcs.xprt_buf. Wake up the xprt to warn about new data available for
transmission.

3 years agoMEDIUM: mux-quic: subscribe on xprt if remaining data after send
Amaury Denoyelle [Fri, 3 Dec 2021 13:38:31 +0000 (14:38 +0100)] 
MEDIUM: mux-quic: subscribe on xprt if remaining data after send

The streams data are transferred from the qcs.buf to the qcs.xprt_buf
during qc_send. If the xprt_buf is not empty and not all data can be
transferred, subscribe the connection on the xprt for sending.

The mux will be woken up by the xprt when the xprt_buf will be cleared.
This happens on ACK reception.

3 years agoMINOR: mux-quic: implement subscribe on stream
Amaury Denoyelle [Mon, 6 Dec 2021 10:24:00 +0000 (11:24 +0100)] 
MINOR: mux-quic: implement subscribe on stream

Implement the subscription in the mux on the qcs instance.

Subscribe is now used by the h3 layer when receiving an incomplete frame
on the H3 control stream. It is also used when attaching the remote
uni-directional streams on the h3 layer.

In the qc_send, the mux wakes up the qcs for each new transfer executed.
This is done via the method qcs_notify_send().

The xprt wakes up the qcs when receiving data on unidirectional streams.
This is done via the method qcs_notify_recv().

3 years agoMEDIUM: quic: detect the stream FIN
Amaury Denoyelle [Fri, 3 Dec 2021 14:03:36 +0000 (15:03 +0100)] 
MEDIUM: quic: detect the stream FIN

Set the QC_SF_FIN_STREAM on the app layers (h3 / hq-interop) when
reaching the HTX EOM. This is used to warn the mux layer to set the FIN
on the QUIC stream.

3 years agoMEDIUM: mux-quic: implement release mux operation
Amaury Denoyelle [Mon, 6 Dec 2021 15:03:47 +0000 (16:03 +0100)] 
MEDIUM: mux-quic: implement release mux operation

Implement qc_release. This function is called by the upper layer on
connection close. For the moment, this only happens on client timeout.

This functions is used the free a qcs instance. If all bidirectional
streams are freed, the qcc instance and the connection are purged.

3 years agoMAJOR: mux-quic: implement a simplified mux version
Amaury Denoyelle [Fri, 3 Dec 2021 10:36:46 +0000 (11:36 +0100)] 
MAJOR: mux-quic: implement a simplified mux version

Re-implement the QUIC mux. It will reuse the mechanics from the previous
mux without all untested/unsupported features. This should ease the
maintenance.

Note that a lot of features are broken for the moment. They will be
re-implemented on the following commits to have a clean commit history.

3 years agoMINOR: h3: remove duplicated FIN flag position
Amaury Denoyelle [Mon, 6 Dec 2021 15:18:43 +0000 (16:18 +0100)] 
MINOR: h3: remove duplicated FIN flag position

The FIN flag is already set in h3_snd_buf on HTX EOM reception. The same
action in h3_resp_headers_send is duplicated and thus now removed.

3 years agoMEDIUM: xprt-quic: finalize app layer initialization after ALPN nego
Amaury Denoyelle [Fri, 3 Dec 2021 13:44:21 +0000 (14:44 +0100)] 
MEDIUM: xprt-quic: finalize app layer initialization after ALPN nego

The app layer is initialized after the handshake completion by the XPRT
stack. Call the finalize operation just after that.

Remove the erroneous call to finalize by the mux in the TPs callback as
the app layer is not yet initialized at this stage.

This should fix the missing H3 settings currently not emitted by
haproxy.

3 years agoMINOR: h3: add BUG_ON on control receive function
Amaury Denoyelle [Mon, 6 Dec 2021 13:26:52 +0000 (14:26 +0100)] 
MINOR: h3: add BUG_ON on control receive function

Add BUG_ON statement when handling a non implemented frames on the
control stream. This is required because frames must be removed from the
RX buffer or else it will stall the buffer.

3 years agoMINOR: quic: fix segfault on CONNECTION_CLOSE parsing
Amaury Denoyelle [Tue, 7 Dec 2021 14:32:00 +0000 (15:32 +0100)] 
MINOR: quic: fix segfault on CONNECTION_CLOSE parsing

At the moment the reason_phrase member of a
quic_connection_close/quic_connection_close_app structure is not
allocated. Comment the memcpy to it to avoid segfault.

3 years agoIMPORT: slz: use the correct CRC32 instruction when running in 32-bit mode
Willy Tarreau [Fri, 3 Dec 2021 16:38:42 +0000 (17:38 +0100)] 
IMPORT: slz: use the correct CRC32 instruction when running in 32-bit mode

Many ARMv8 processors also support Aarch32 and can run armv7 and even
thumb2 code. While armv8 compilers will not emit these instructions,
armv7 compilers that are aware of these processors will do. For
example, using gcc built for an armv7 target and passing it
"-mcpu=cortex-a72" or "-march=armv8-a+crc" will result in the CRC32
instruction to be used.

In this case the current assembly code fails because with the ARM and
Thumb2 instruction sets there is no such "%wX" half-registers. We need
to use "%X" instead as the native 32-bit register when running with a
32-bit instruction set, and use "%wX" when using the 64-bit instruction
set (A64).

This is slz upstream commit fab83248612a1e8ee942963fe916a9cdbf085097

3 years agoBUILD: tree-wide: avoid warnings caused by redundant checks of obj_types
Willy Tarreau [Mon, 6 Dec 2021 07:01:02 +0000 (07:01 +0000)] 
BUILD: tree-wide: avoid warnings caused by redundant checks of obj_types

At many places we use construct such as:

   if (objt_server(blah))
       do_something(objt_server(blah));

At -O2 the compiler manages to simplify the operation and see that the
second one returns the same result as the first one. But at -O1 that's
not always the case, and the compiler is able to emit a second
expression and sees the potential null that results from it, and may
warn about a potential null deref (e.g. with gcc-6.5). There are two
solutions to this:
  - either the result of the first test has to be passed to a local
    variable
  - or the second reference ought to be unchecked using the __objt_*
    variant.

This patch fixes all occurrences at once by taking the second approach
(the least intrusive). For constructs like:

   objt_server(blah) ? objt_server(blah)->name : "no name"

a macro could be useful. It would for example take the object type
(server), the field name (name) and the default value. But there
are probably not enough occurrences across the whole code for this
to really matter.

This should be backported wherever it applies.

3 years agoDOC: config: Specify %Ta is only available in HTTP mode
Christopher Faulet [Fri, 3 Dec 2021 09:48:36 +0000 (10:48 +0100)] 
DOC: config: Specify %Ta is only available in HTTP mode

%Ta format can only be used in HTTP mode but it was not specify in the
configuration manual.

This patch should fix the issue #1317.

3 years agoDOC: spoe: Clarify use of the event directive in spoe-message section
Christopher Faulet [Fri, 3 Dec 2021 09:18:09 +0000 (10:18 +0100)] 
DOC: spoe: Clarify use of the event directive in spoe-message section

Only one event is possible for a spoe-message section. If defined several
time, only the last one is considered. The documentation is now explicit on
this point.

This patch is related to the the issue #1351.

3 years agoBUG/MEDIUM: sample: Fix memory leak in sample_conv_jwt_member_query
Tim Duesterhus [Wed, 1 Dec 2021 22:04:15 +0000 (23:04 +0100)] 
BUG/MEDIUM: sample: Fix memory leak in sample_conv_jwt_member_query

The function leaked one full buffer per invocation. Fix this by simply removing
the call to alloc_trash_chunk(), the static chunk from get_trash_chunk() is
sufficient.

This bug was introduced in 0a72f5ee7c2a61bdb379436461269315c776b50a, which is
2.5-dev10. This fix needs to be backported to 2.5+.

3 years agoBUILD: bug: Fix error when compiling with -DDEBUG_STRICT_NOCRASH
Christopher Faulet [Fri, 3 Dec 2021 07:58:22 +0000 (08:58 +0100)] 
BUILD: bug: Fix error when compiling with -DDEBUG_STRICT_NOCRASH

ha_backtrace_to_stderr() must be declared in CRASH_NOW() macro whe HAProxy
is compiled with DEBUG_STRICT_NOCRASH. Otherwise an error is reported during
compilation:

include/haproxy/bug.h:58:26: error: implicit declaration of function ‘ha_backtrace_to_stderr’ [-Werror=implicit-function-declaration]
   58 | #define CRASH_NOW() do { ha_backtrace_to_stderr(); } while (0)

This patch must be backported as far as 2.4.

3 years agoBUG/MINOR: resolvers: Don't overwrite the error for invalid query domain name
Christopher Faulet [Thu, 2 Dec 2021 09:05:02 +0000 (10:05 +0100)] 
BUG/MINOR: resolvers: Don't overwrite the error for invalid query domain name

When a response is validated, the query domain name is checked to be sure it
is the same than the one requested. When an error is reported, the wrong
goto label was used. Thus, the error was lost. Instead of
RSLV_RESP_WRONG_NAME, RSLV_RESP_INVALID was reported.

This bug was introduced by the commit c1699f8c1 ("MEDIUM: resolvers: No
longer store query items in a list into the response").

This patch should fix the issue #1473. No backport is needed.

3 years agoBUG/MEDIUM: h1: Properly reset h1m flags when headers parsing is restarted
Christopher Faulet [Wed, 1 Dec 2021 17:01:48 +0000 (18:01 +0100)] 
BUG/MEDIUM: h1: Properly reset h1m flags when headers parsing is restarted

If H1 headers are not fully received at once, the parsing is restarted a
last time when all headers are finally received. When this happens, the h1m
flags are sanitized to remove all value set during parsing.

But some flags where erroneously preserved. Among others, H1_MF_TE_CHUNKED
flag was not removed, what could lead to parsing error.

To fix the bug and make things easy, a mask has been added with all flags
that must be preserved. It will be more stable. This mask is used to
sanitize h1m flags.

This patch should fix the issue #1469. It must be backported to 2.5.

3 years agoBUG/MAJOR: segfault using multiple log forward sections.
Emeric Brun [Wed, 1 Dec 2021 11:08:42 +0000 (12:08 +0100)] 
BUG/MAJOR: segfault using multiple log forward sections.

For each new log forward section, the proxy was added to the log forward
proxy list but the ref on the previous log forward section's proxy was
scratched using "init_new_proxy" which performs a memset. After configuration
parsing this list contains only the last section's proxy.

The post processing walk through this list to resolve "ring" names.
Since some section's proxies are missing in this list, the resolving
is not done for those ones and the pointer on the ring is kept to null
causing a segfault at runtime trying to write a log message
into the ring.

This patch shift the "init_new_proxy" before adding the ref on the
previous log forward section's proxy on currently parsed one.

This patch shoud fix github issue #1464

This patch should be backported to 2.3

3 years agoMEDIUM: resolvers: No longer store query items in a list into the response
Christopher Faulet [Wed, 1 Dec 2021 14:07:26 +0000 (15:07 +0100)] 
MEDIUM: resolvers: No longer store query items in a list into the response

When the response is parsed, query items are stored in a list, attached to
the parsed response (resolve_response).

First, there is one and only one query sent at a time. Thus, there is no
reason to use a list. There is a test to be sure there is only one query
item in the response. Then, the reference on this query item is only used to
validate the domain name is the one requested. So the query list can be
removed. We only expect one query item, no reason to loop on query records.
In addition, the query domain name is now immediately checked against the
resolution domain name. This way, the query item is only manipulated during
the response parsing.