]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
5 years agoSCRIPTS: announce-release: place the send command in the mail's header
Willy Tarreau [Fri, 7 Feb 2020 07:10:06 +0000 (08:10 +0100)] 
SCRIPTS: announce-release: place the send command in the mail's header

I'm fed up with having to scroll my terminals trying to look for the
mail send command printed 30 minutes before the release, let's have
it copied into the e-mail template itself, and replace the old headers
that used to be duplicated there and that are not needed anymore.

5 years ago[RELEASE] Released version 2.2-dev2 v2.2-dev2
Willy Tarreau [Fri, 7 Feb 2020 03:12:19 +0000 (04:12 +0100)] 
[RELEASE] Released version 2.2-dev2

Released version 2.2-dev2 with the following main changes :
    - BUILD: CI: temporarily mark openssl-1.0.2 as allowed failure
    - MEDIUM: cli: Allow multiple filter entries for "show table"
    - BUG/MEDIUM: netscaler: Don't forget to allocate storage for conn->src/dst.
    - BUG/MINOR: ssl: ssl_sock_load_pem_into_ckch is not consistent
    - BUILD: stick-table: fix build errors introduced by last stick-table change
    - BUG/MINOR: cli: Missing arg offset for filter data values.
    - MEDIUM: streams: Always create a conn_stream in connect_server().
    - MEDIUM: connections: Get ride of the xprt_done callback.
    - CLEANUP: changelog: remove the duplicate entry for 2.2-dev1
    - BUILD: CI: move cygwin builds to Github Actions
    - MINOR: cli: Report location of errors or any extra data for "show table"
    - BUG/MINOR: ssl/cli: free the previous ckch content once a PEM is loaded
    - CLEANUP: backend: remove useless test for inexistent connection
    - CLEANUP: backend: shut another false null-deref in back_handle_st_con()
    - CLEANUP: stats: shut up a wrong null-deref warning from gcc 9.2
    - BUG/MINOR: ssl: increment issuer refcount if in chain
    - BUG/MINOR: ssl: memory leak w/ the ocsp_issuer
    - BUG/MINOR: ssl: typo in previous patch
    - BUG/MEDIUM: connections: Set CO_FL_CONNECTED in conn_complete_session().
    - BUG/MINOR: ssl/cli: ocsp_issuer must be set w/ "set ssl cert"
    - MEDIUM: connection: remove CO_FL_CONNECTED and only rely on CO_FL_WAIT_*
    - BUG/MEDIUM: 0rtt: Only consider the SSL handshake.
    - MINOR: stream-int: always report received shutdowns
    - MINOR: connection: remove CO_FL_SSL_WAIT_HS from CO_FL_HANDSHAKE
    - MEDIUM: connection: use CO_FL_WAIT_XPRT more consistently than L4/L6/HANDSHAKE
    - MINOR: connection: remove checks for CO_FL_HANDSHAKE before I/O
    - MINOR: connection: do not check for CO_FL_SOCK_RD_SH too early
    - MINOR: connection: don't check for CO_FL_SOCK_WR_SH too early in handshakes
    - MINOR: raw-sock: always check for CO_FL_SOCK_WR_SH before sending
    - MINOR: connection: remove some unneeded checks for CO_FL_SOCK_WR_SH
    - BUG/MINOR: stktable: report the current proxy name in error messages
    - BUG/MEDIUM: mux-h2: make sure we don't emit TE headers with anything but "trailers"
    - MINOR: lua: Add hlua_prepend_path function
    - MINOR: lua: Add lua-prepend-path configuration option
    - MINOR: lua: Add HLUA_PREPEND_C?PATH build option
    - BUILD: cfgparse: silence a bogus gcc warning on 32-bit machines
    - BUG/MINOR: http-ana: Increment the backend counters on the backend
    - BUG/MINOR: stream: Be sure to have a listener to increment its counters
    - BUG/MEDIUM: streams: Move the conn_stream allocation outside #IF USE_OPENSSL.
    - REGTESTS: make the set_ssl_cert test require version 2.2
    - BUG/MINOR: ssl: Possible memleak when allowing the 0RTT data buffer.
    - MINOR: ssl: Remove dead code.
    - BUG/MEDIUM: ssl: Don't forget to free ctx->ssl on failure.
    - BUG/MEDIUM: stream: Don't install the mux in back_handle_st_con().
    - MEDIUM: streams: Don't close the connection in back_handle_st_con().
    - MEDIUM: streams: Don't close the connection in back_handle_st_rdy().
    - BUILD: CI: disable slow regtests on Travis
    - BUG/MINOR: tcpchecks: fix the connect() flags regarding delayed ack
    - BUG/MINOR: http-rules: Always init log-format expr for common HTTP actions
    - BUG/MINOR: connection: fix ip6 dst_port copy in make_proxy_line_v2
    - BUG/MINOR: dns: allow 63 char in hostname
    - MINOR: proxy: clarify number of connections log when stopping
    - DOC: word converter ignores delimiters at the start or end of input string
    - MEDIUM: raw-sock: remove obsolete calls to fd_{cant,cond,done}_{send,recv}
    - BUG/MINOR: ssl/cli: fix unused variable with openssl < 1.0.2
    - MEDIUM: pipe/thread: reduce the locking overhead
    - MEDIUM: pipe/thread: maintain a per-thread local cache of recently used pipes
    - BUG/MEDIUM: pipe/thread: fix atomicity of pipe counters
    - MINOR: tasks: move the list walking code to its own function
    - MEDIUM: tasks: implement 3 different tasklet classes with their own queues
    - MEDIUM: tasks: automatically requeue into the bulk queue an already running tasklet
    - OPTIM: task: refine task classes default CPU bandwidth ratios
    - BUG/MEDIUM: connections: Don't forget to unlock when killing a connection.
    - MINOR: task: permanently flag tasklets waking themselves up
    - MINOR: task: make sched->current also reflect tasklets
    - MINOR: task: detect self-wakeups on tl==sched->current instead of TASK_RUNNING
    - OPTIM: task: readjust CPU bandwidth distribution since last update
    - MINOR: task: don't set TASK_RUNNING on tasklets
    - BUG/MEDIUM: memory_pool: Update the seq number in pool_flush().
    - MINOR: memory: Only init the pool spinlock once.
    - BUG/MEDIUM: memory: Add a rwlock before freeing memory.
    - BUG/MAJOR: memory: Don't forget to unlock the rwlock if the pool is empty.
    - MINOR: ssl: ssl-load-extra-files configure loading of files
    - SCRIPTS: add a new "backport" script to simplify long series of backports
    - BUG/MINOR: ssl: we may only ignore the first 64 errors
    - SCRIPTS: use /usr/bin/env bash instead of /bin/bash for scripts
    - BUG/MINOR: ssl: clear the SSL errors on DH loading failure
    - CLEANUP: hpack: remove a redundant test in the decoder
    - CLEANUP: peers: Remove unused static function `free_dcache`
    - CLEANUP: peers: Remove unused static function `free_dcache_tx`
    - CONTRIB: debug: add missing flags SF_HTX and SF_MUX
    - CONTRIB: debug: add the possibility to decode the value as certain types only
    - CONTRIB: debug: support reporting multiple values at once
    - BUG/MINOR: http-act: Use the good message to test strict rewritting mode
    - MINOR: global: Set default tune.maxrewrite value during global structure init
    - MINOR: http-rules: Set SF_ERR_PRXCOND termination flag when a header rewrite fails
    - MINOR: http-htx: Emit a warning if an error file runs over the buffer's reserve
    - MINOR: htx: Add a function to append an HTX message to another one
    - MINOR: htx/channel: Add a function to copy an HTX message in a channel's buffer
    - BUG/MINOR: http-ana: Don't overwrite outgoing data when an error is reported
    - MINOR: dns: Dynamically allocate dns options to reduce the act_rule size
    - MINOR: dns: Add function to release memory allocated for a do-resolve rule
    - BUG/MINOR: http-ana: Reset HTX first index when HAPRoxy sends a response
    - BUG/MINOR: http-ana: Set HTX_FL_PROXY_RESP flag if a server perform a redirect
    - MINOR: http-rules: Add a flag on redirect rules to know the rule direction
    - MINOR: http-rules: Handle the rule direction when a redirect is evaluated
    - MINOR: http-ana: Rely on http_reply_and_close() to handle server error
    - MINOR: http-ana: Add a function for forward internal responses
    - MINOR: http-ana/http-rules: Use dedicated function to forward internal responses
    - MEDIUM: http: Add a ruleset evaluated on all responses just before forwarding
    - MEDIUM: http-rules: Add the return action to HTTP rules
    - MEDIUM: http-rules: Support extra headers for HTTP return actions
    - CLEANUP: lua: Remove consistency check for sample fetches and actions
    - BUG/MINOR: http-ana: Increment failed_resp counters on invalid response
    - MINOR: lua: Get the action return code on the stack when an action finishes
    - MINOR: lua: Create the global 'act' object to register all action return codes
    - MINOR: lua: Add act:wake_time() function to set a timeout when an action yields
    - MEDIUM: lua: Add ability for actions to intercept HTTP messages
    - REGTESTS: Add reg tests for the HTTP return action
    - REGTESTS: Add a reg test for http-after-response rulesets
    - BUILD: lua: silence a warning on systems where longjmp is not marked as noreturn
    - MINOR: acl: Warn when an ACL is named 'or'
    - CONTRIB: debug: also support reading values from stdin
    - SCRIPTS: backport: use short revs and resolve the initial commit
    - BUG/MINOR: acl: Fix type of log message when an acl is named 'or'

5 years agoBUG/MINOR: acl: Fix type of log message when an acl is named 'or'
Tim Duesterhus [Thu, 6 Feb 2020 21:04:03 +0000 (22:04 +0100)] 
BUG/MINOR: acl: Fix type of log message when an acl is named 'or'

The patch adding this check initially only issued a warning, instead of
being fatal. It was changed before committing. However when making this
change the type of the log message was not changed from `ha_warning` to
`ha-alert`. This patch makes this forgotten adjustment.

see 0cf811a5f941261176b67046dbc542d0479ff4a7
No backport needed. The initial patch was backported as a warning, thus
the log message type is correct.

5 years agoSCRIPTS: backport: use short revs and resolve the initial commit
Willy Tarreau [Thu, 6 Feb 2020 17:38:19 +0000 (18:38 +0100)] 
SCRIPTS: backport: use short revs and resolve the initial commit

I find myself often getting trapped into calling "backport 2.0 HEAD" which
doesn't work because "HEAD" is passed as the argument to cherry-pick in
other repos. Let's resolve it first. And also let's shorten the commit IDs
to make the error messages more readable and to ease copy-paste.

5 years agoCONTRIB: debug: also support reading values from stdin
Willy Tarreau [Thu, 6 Feb 2020 17:17:50 +0000 (18:17 +0100)] 
CONTRIB: debug: also support reading values from stdin

This is convenient when processing large dumps, it allows to copy-paste
values to inspect from one window to another, or to directly transfer
a "show fd"/"show stream" output through sed. In order to do this, simply
pass "-" alone instead of the value and they will all be read one line at
a time from stdin. For example, in order to quickly print the different
set of connection flags from "show fd", this is sufficient:

     sed -ne 's/^.* cflg=\([^ ]*\).*/\1/p' | contrib/debug/flags conn -

5 years agoMINOR: acl: Warn when an ACL is named 'or'
Tim Duesterhus [Wed, 5 Feb 2020 20:00:50 +0000 (21:00 +0100)] 
MINOR: acl: Warn when an ACL is named 'or'

Consider a configuration like this:

> acl t always_true
> acl or always_false
>
> http-response set-header Foo Bar if t or t

The 'or' within the condition will be treated as a logical disjunction
and the header will be set, despite the ACL 'or' being falsy.

This patch makes it an error to declare such an ACL that will never
work. This patch may be backported to stable releases, turning the
error into a warning only (the code was written in a way to make this
trivial). It should not break anything and might improve the users'
lifes.

5 years agoBUILD: lua: silence a warning on systems where longjmp is not marked as noreturn
Willy Tarreau [Thu, 6 Feb 2020 14:55:41 +0000 (15:55 +0100)] 
BUILD: lua: silence a warning on systems where longjmp is not marked as noreturn

If the longjmp() call is not flagged as "noreturn", for example, because the
operating system doesn't target a gcc-compatible compiler, we may get this
warning when building Lua :

  src/hlua.c: In function 'hlua_panic_ljmp':
  src/hlua.c:128:1: warning: no return statement in function returning non-void [-Wreturn-type]
   static int hlua_panic_ljmp(lua_State *L) { longjmp(safe_ljmp_env, 1); }
   ^~~~~~

The function's prototype cannot be changed because it must be compatible
with Lua's callbacks. Let's simply enclose the call inside WILL_LJMP()
which we created exactly to signal a call to longjmp(). It lets the compiler
know we won't get back into the function and that the return statement is
not needed.

5 years agoREGTESTS: Add a reg test for http-after-response rulesets
Christopher Faulet [Thu, 6 Feb 2020 13:27:09 +0000 (14:27 +0100)] 
REGTESTS: Add a reg test for http-after-response rulesets

A reg test has been added to ensure the evaluation of http-after-responses rules
is functionnal for all kind of responses (server, applet and internal
responses).

5 years agoREGTESTS: Add reg tests for the HTTP return action
Christopher Faulet [Wed, 5 Feb 2020 15:46:38 +0000 (16:46 +0100)] 
REGTESTS: Add reg tests for the HTTP return action

2 reg tests have been added to ensure the HTTP return action is functionnal. A
reg test is about returning error files. The other one is about returning
default responses and responses based on string or file payloads.

5 years agoMEDIUM: lua: Add ability for actions to intercept HTTP messages
Christopher Faulet [Fri, 31 Jan 2020 11:21:52 +0000 (12:21 +0100)] 
MEDIUM: lua: Add ability for actions to intercept HTTP messages

It is now possible to intercept HTTP messages from a lua action and reply to
clients. To do so, a reply object must be provided to the function
txn:done(). It may contain a status code with a reason, a header list and a
body. By default, if an empty reply object is used, an empty 200 response is
returned. If no reply is passed when txn:done() is called, the previous
behaviour is respected, the transaction is terminated and nothing is returned to
the client. The same is done for TCP streams. When txn:done() is called, the
action is terminated with the code ACT_RET_DONE on success and ACT_RET_ERR on
error, interrupting the message analysis.

The reply object may be created for the lua, by hand. Or txn:reply() may be
called. If so, this object provides some methods to fill it:

  * Reply:set_status(<status> [  <reason>]) : Set the status and optionally the
   reason. If no reason is provided, the default one corresponding to the status
   code is used.

  * Reply:add_header(<name>, <value>) : Add a header. For a given name, the
    values are stored in an ordered list.

  * Reply:del_header(<name>) : Removes all occurrences of a header name.

  * Reply:set_body(<body>) : Set the reply body.

Here are some examples, all doing the same:

    -- ex. 1
    txn:done{
        status  = 400,
        reason  = "Bad request",
        headers = {
            ["content-type"]  = { "text/html" },
            ["cache-control"] = { "no-cache", "no-store" },
        },
        body = "<html><body><h1>invalid request<h1></body></html>"
    }

    -- ex. 2
    local reply = txn:reply{
        status  = 400,
        reason  = "Bad request",
        headers = {
            ["content-type"]  = { "text/html" },
            ["cache-control"] = { "no-cache", "no-store" }
        },
        body = "<html><body><h1>invalid request<h1></body></html>"
    }
    txn:done(reply)

    -- ex. 3
    local reply = txn:reply()
    reply:set_status(400, "Bad request")
    reply:add_header("content-length", "text/html")
    reply:add_header("cache-control", "no-cache")
    reply:add_header("cache-control", "no-store")
    reply:set_body("<html><body><h1>invalid request<h1></body></html>")
    txn:done(reply)

5 years agoMINOR: lua: Add act:wake_time() function to set a timeout when an action yields
Christopher Faulet [Fri, 31 Jan 2020 18:07:52 +0000 (19:07 +0100)] 
MINOR: lua: Add act:wake_time() function to set a timeout when an action yields

This function may be used to defined a timeout when a lua action returns
act:YIELD. It is a way to force to reexecute the script after a short time
(defined in milliseconds).

Unlike core:sleep() or core:yield(), the script is fully reexecuted if it
returns act:YIELD. With core functions to yield, the script is interrupted and
restarts from the yield point. When a script returns act:YIELD, it is finished
but the message analysis is blocked on the action waiting its end.

5 years agoMINOR: lua: Create the global 'act' object to register all action return codes
Christopher Faulet [Fri, 31 Jan 2020 17:57:12 +0000 (18:57 +0100)] 
MINOR: lua: Create the global 'act' object to register all action return codes

ACT_RET_* code are now available from lua scripts. The gloabl object "act" is
used to register these codes as constant. Now, lua actions can return any of
following codes :

  * act.CONTINUE for ACT_RET_CONT
  * act.STOP for ACT_RET_STOP
  * act.YIELD for ACT_RET_YIELD
  * act.ERROR for ACT_RET_ERR
  * act.DONE for ACT_RET_DONE
  * act.DENY for ACT_RET_DENY
  * act.ABORT for ACT_RET_ABRT
  * act.INVALID for ACT_RET_INV

For instance, following script denied all requests :

  core.register_action("deny", { "http-req" }, function (txn)
      return act.DENY
  end)

Thus "http-request lua.deny" do exactly the same than "http-request deny".

5 years agoMINOR: lua: Get the action return code on the stack when an action finishes
Christopher Faulet [Wed, 29 Jan 2020 10:53:30 +0000 (11:53 +0100)] 
MINOR: lua: Get the action return code on the stack when an action finishes

When an action successfully finishes, the action return code (ACT_RET_*) is now
retrieve on the stack, ff the first element is an integer. In addition, in
hlua_txn_done(), the value ACT_RET_DONE is pushed on the stack before
exiting. Thus, when a script uses this function, the corresponding action still
finishes with the good code. Thanks to this change, the flag HLUA_STOP is now
useless. So it has been removed.

It is a mandatory step to allow a lua action to return any action return code.

5 years agoBUG/MINOR: http-ana: Increment failed_resp counters on invalid response
Christopher Faulet [Wed, 5 Feb 2020 09:16:41 +0000 (10:16 +0100)] 
BUG/MINOR: http-ana: Increment failed_resp counters on invalid response

In http_process_res_common() analyzer, when a invalid response is reported, the
failed_resp counters must be incremented.

No need to backport this patch, except if the commit b8a5371a ("MEDIUM:
http-ana: Properly handle internal processing errors") is backported too.

5 years agoCLEANUP: lua: Remove consistency check for sample fetches and actions
Christopher Faulet [Wed, 29 Jan 2020 10:51:39 +0000 (11:51 +0100)] 
CLEANUP: lua: Remove consistency check for sample fetches and actions

It is not possible anymore to alter the HTTP parser state from lua sample
fetches or lua actions. So there is no reason to still check for the parser
state consistency.

5 years agoMEDIUM: http-rules: Support extra headers for HTTP return actions
Christopher Faulet [Fri, 31 Jan 2020 16:36:01 +0000 (17:36 +0100)] 
MEDIUM: http-rules: Support extra headers for HTTP return actions

It is now possible to append extra headers to the generated responses by HTTP
return actions, while it is not based on an errorfile. For return actions based
on errorfiles, these extra headers are ignored. To define an extra header, a
"hdr" argument must be used with a name and a value. The value is a log-format
string. For instance:

  http-request status 200 hdr "x-src" "%[src]" hdr "x-dst" "%[dst]"

5 years agoMEDIUM: http-rules: Add the return action to HTTP rules
Christopher Faulet [Fri, 24 Jan 2020 16:44:23 +0000 (17:44 +0100)] 
MEDIUM: http-rules: Add the return action to HTTP rules

Thanks to this new action, it is now possible to return any responses from
HAProxy, with any status code, based on an errorfile, a file or a string. Unlike
the other internal messages generated by HAProxy, these ones are not interpreted
as errors. And it is not necessary to use a file containing a full HTTP
response, although it is still possible. In addition, using a log-format string
or a log-format file, it is possible to have responses with a dynamic
content. This action can be used on the request path or the response path. The
only constraint is to have a responses smaller than a buffer. And to avoid any
warning the buffer space reserved to the headers rewritting should also be free.

When a response is returned with a file or a string as payload, it only contains
the content-length header and the content-type header, if applicable. Here are
examples:

  http-request return content-type image/x-icon file /var/www/favicon.ico  \
      if { path /favicon.ico }

  http-request return status 403 content-type text/plain    \
      lf-string "Access denied. IP %[src] is blacklisted."  \
      if { src -f /etc/haproxy/blacklist.lst }

5 years agoMEDIUM: http: Add a ruleset evaluated on all responses just before forwarding
Christopher Faulet [Wed, 22 Jan 2020 08:26:35 +0000 (09:26 +0100)] 
MEDIUM: http: Add a ruleset evaluated on all responses just before forwarding

This patch introduces the 'http-after-response' rules. These rules are evaluated
at the end of the response analysis, just before the data forwarding, on ALL
HTTP responses, the server ones but also all responses generated by
HAProxy. Thanks to this ruleset, it is now possible for instance to add some
headers to the responses generated by the stats applet. Following actions are
supported :

   * allow
   * add-header
   * del-header
   * replace-header
   * replace-value
   * set-header
   * set-status
   * set-var
   * strict-mode
   * unset-var

5 years agoMINOR: http-ana/http-rules: Use dedicated function to forward internal responses
Christopher Faulet [Tue, 28 Jan 2020 08:28:11 +0000 (09:28 +0100)] 
MINOR: http-ana/http-rules: Use dedicated function to forward internal responses

Call http_forward_proxy_resp() function when an internal response is
returned. It concerns redirect, auth and error reponses. But also 100-Continue
and 103-Early-Hints responses. For errors, there is a subtlety. if the forward
fails, an HTTP 500 error is generated if it is not already an internal
error. For now http_forward_proxy_resp() cannot fail. But it will be possible
when the new ruleset applied on all responses will be added.

5 years agoMINOR: http-ana: Add a function for forward internal responses
Christopher Faulet [Tue, 28 Jan 2020 08:26:19 +0000 (09:26 +0100)] 
MINOR: http-ana: Add a function for forward internal responses

Operations performed when internal responses (redirect/deny/auth/errors) are
returned are always the same. The http_forward_proxy_resp() function is added to
group all of them under a unique function.

5 years agoMINOR: http-ana: Rely on http_reply_and_close() to handle server error
Christopher Faulet [Mon, 27 Jan 2020 14:32:25 +0000 (15:32 +0100)] 
MINOR: http-ana: Rely on http_reply_and_close() to handle server error

The http_server_error() function now relies on http_reply_and_close(). Both do
almost the same actions. In addtion, http_server_error() sets the error flag and
the final state flag on the stream.

5 years agoMINOR: http-rules: Handle the rule direction when a redirect is evaluated
Christopher Faulet [Tue, 28 Jan 2020 08:18:10 +0000 (09:18 +0100)] 
MINOR: http-rules: Handle the rule direction when a redirect is evaluated

The rule direction must be tested to do specific processing on the request
path. intercepted_req counter shoud be updated if the rule is evaluated on the
frontend and remaining request's analyzers must be removed. But only on the
request path. The rule direction must also be tested to set the right final
stream state flag.

This patch depends on the commit "MINOR: http-rules: Add a flag on redirect
rules to know the rule direction". Both must be backported to all stable
versions.

5 years agoMINOR: http-rules: Add a flag on redirect rules to know the rule direction
Christopher Faulet [Tue, 28 Jan 2020 08:13:41 +0000 (09:13 +0100)] 
MINOR: http-rules: Add a flag on redirect rules to know the rule direction

HTTP redirect rules can be evaluated on the request or the response path. So
when a redirect rule is evaluated, it is important to have this information
because some specific processing may be performed depending on the direction. So
the REDIRECT_FLAG_FROM_REQ flag has been added. It is set when applicable on the
redirect rule during the parsing.

This patch is mandatory to fix a bug on redirect rule. It must be backported to
all stable versions.

5 years agoBUG/MINOR: http-ana: Set HTX_FL_PROXY_RESP flag if a server perform a redirect
Christopher Faulet [Fri, 24 Jan 2020 18:16:26 +0000 (19:16 +0100)] 
BUG/MINOR: http-ana: Set HTX_FL_PROXY_RESP flag if a server perform a redirect

It is important to not forget to specify the HTX resposne was internally
generated when a server perform a redirect. This information is used by the H1
multiplexer to choose the right connexion mode when the response is sent to the
client.

This patch must be backported to 2.1.

5 years agoBUG/MINOR: http-ana: Reset HTX first index when HAPRoxy sends a response
Christopher Faulet [Fri, 24 Jan 2020 18:12:35 +0000 (19:12 +0100)] 
BUG/MINOR: http-ana: Reset HTX first index when HAPRoxy sends a response

The first index in an HTX message is the HTX block index from which the HTTP
analysis must be performed. When HAProxy sends an HTTP response, on error or
redirect, this index must be reset because all pending incoming data are
considered as forwarded. For now, it is only a bug for 103-Early-Hints
response. For other responses, it is not a problem. But it will be when the new
ruleset applied on all responses will be added. For 103 responses, if the first
index is not reset, if there are rewritting rules on server responses, the
generated 103 responses, if any, are evaluated too.

This patch must be backported and probably adapted, at least for 103 responses,
as far as 1.9.

5 years agoMINOR: dns: Add function to release memory allocated for a do-resolve rule
Christopher Faulet [Fri, 24 Jan 2020 17:12:58 +0000 (18:12 +0100)] 
MINOR: dns: Add function to release memory allocated for a do-resolve rule

Memory allocated when a do-resolve rule is parsed is now released when HAProxy
exits.

5 years agoMINOR: dns: Dynamically allocate dns options to reduce the act_rule size
Christopher Faulet [Fri, 24 Jan 2020 17:08:42 +0000 (18:08 +0100)] 
MINOR: dns: Dynamically allocate dns options to reduce the act_rule size

<.arg.dns.dns_opts> field in the act_rule structure is now dynamically allocated
when a do-resolve rule is parsed. This drastically reduces the structure size.

5 years agoBUG/MINOR: http-ana: Don't overwrite outgoing data when an error is reported
Christopher Faulet [Thu, 23 Jan 2020 10:57:31 +0000 (11:57 +0100)] 
BUG/MINOR: http-ana: Don't overwrite outgoing data when an error is reported

When an error is returned to a client, the right message is injected into the
response buffer. It is performed by http_server_error() or
http_replay_and_close(). Both ignore any data already present into the channel's
buffer. While it is legitimate to remove all input data, it is important to not
remove any outgoing data.

So now, we try to append the error message to the response buffer, only removing
input data. We rely on the channel_htx_copy_msg() function to do so. So this
patch depends on the following two commits:

  * MINOR: htx: Add a function to append an HTX message to another one
  * MINOR: htx/channel: Add a function to copy an HTX message in a channel's buffer

This patch must be backported as far as 1.9. However, above patches must be
backported first.

5 years agoMINOR: htx/channel: Add a function to copy an HTX message in a channel's buffer
Christopher Faulet [Thu, 23 Jan 2020 10:53:18 +0000 (11:53 +0100)] 
MINOR: htx/channel: Add a function to copy an HTX message in a channel's buffer

The channel_htx_copy_msg() function can now be used to copy an HTX message in a
channel's buffer. This function takes care to not overwrite existing data.

This patch depends on the commit "MINOR: htx: Add a function to append an HTX
message to another one". Both are mandatory to fix a bug in
http_reply_and_close() function. Be careful to backport both first.

5 years agoMINOR: htx: Add a function to append an HTX message to another one
Christopher Faulet [Thu, 23 Jan 2020 10:47:53 +0000 (11:47 +0100)] 
MINOR: htx: Add a function to append an HTX message to another one

the htx_append_msg() function can now be used to append an HTX message to
another one. All the message is copied or nothing. If an error occurs during the
copy, all changes are rolled back.

This patch is mandatory to fix a bug in http_reply_and_close() function. Be
careful to backport it first.

5 years agoMINOR: http-htx: Emit a warning if an error file runs over the buffer's reserve
Christopher Faulet [Wed, 22 Jan 2020 13:47:04 +0000 (14:47 +0100)] 
MINOR: http-htx: Emit a warning if an error file runs over the buffer's reserve

If an error file is too big and, once converted in HTX, runs over the buffer
space reserved to headers rewritting, a warning is emitted. Because a new set of
rules will be added to allow headers rewritting on all responses, including
HAProxy ones, it is important to always keep this space free for error files.

5 years agoMINOR: http-rules: Set SF_ERR_PRXCOND termination flag when a header rewrite fails
Christopher Faulet [Wed, 22 Jan 2020 13:38:05 +0000 (14:38 +0100)] 
MINOR: http-rules: Set SF_ERR_PRXCOND termination flag when a header rewrite fails

When a header rewrite fails, an internal errors is triggered. But
SF_ERR_INTERNAL is documented to be the concequence of a bug and must be
reported to the dev teamm. So, when this happens, the SF_ERR_PRXCOND termination
flag is set now.

5 years agoMINOR: global: Set default tune.maxrewrite value during global structure init
Christopher Faulet [Wed, 22 Jan 2020 13:31:21 +0000 (14:31 +0100)] 
MINOR: global: Set default tune.maxrewrite value during global structure init

When the global structure is initialized, instead of setting tune.maxrewrite to
-1, its default value can be immediately set. This way, it is always defined
during the configuration validity check. Otherwise, the only way to have it at
this stage, it is to explicity set it in the global section.

5 years agoBUG/MINOR: http-act: Use the good message to test strict rewritting mode
Christopher Faulet [Fri, 24 Jan 2020 14:37:13 +0000 (15:37 +0100)] 
BUG/MINOR: http-act: Use the good message to test strict rewritting mode

Since the strict rewritting mode was introduced, actions manipulating headers
(set/add/replace) always rely on the request message to test if the
HTTP_MSGF_SOFT_RW flag is set or not. But, of course, we must only rely on the
request for http-request rules. For http-response rules, we must use the
response message.

This patch must be backported if the strict rewritting is backported too.

5 years agoCONTRIB: debug: support reporting multiple values at once
Willy Tarreau [Thu, 6 Feb 2020 07:48:16 +0000 (08:48 +0100)] 
CONTRIB: debug: support reporting multiple values at once

It's often convenient, for example to dump two channels or two stream-int
at once. Now all input values are decoded and the value is recalled before
the dump when there is more than one to display.

5 years agoCONTRIB: debug: add the possibility to decode the value as certain types only
Willy Tarreau [Thu, 6 Feb 2020 07:33:08 +0000 (08:33 +0100)] 
CONTRIB: debug: add the possibility to decode the value as certain types only

It's often confusing to have a whole dump on the screen while only
checking for a set of task or stream flags, and appending "|grep ^chn"
isn't very convenient to repeat the opeation. Instead let's add the
ability to filter the output as certain types only by prepending their
name(s) before the value.

5 years agoCONTRIB: debug: add missing flags SF_HTX and SF_MUX
Willy Tarreau [Thu, 6 Feb 2020 06:57:36 +0000 (07:57 +0100)] 
CONTRIB: debug: add missing flags SF_HTX and SF_MUX

These two were forgotten when HTX was added. They can be backported
as they're missing for debugging traces in 2.0.

5 years agoCLEANUP: peers: Remove unused static function `free_dcache_tx`
Tim Duesterhus [Wed, 5 Feb 2020 22:37:15 +0000 (23:37 +0100)] 
CLEANUP: peers: Remove unused static function `free_dcache_tx`

The function was added in commit 6c39198b575444466ddfc5368e481d2a7cf8111d,
but was also used within a single function `free_dcache` which was unused
itself.

see issue #301
see commit 10ce0c2f31ba06e52edfb52176dc47986314321b which removed
`free_dcache`

5 years agoCLEANUP: peers: Remove unused static function `free_dcache`
Tim Duesterhus [Wed, 5 Feb 2020 16:22:02 +0000 (17:22 +0100)] 
CLEANUP: peers: Remove unused static function `free_dcache`

The function was changed to be static in commit
6c39198b575444466ddfc5368e481d2a7cf8111d, but even that commit
no longer uses it. The purpose of the change vs. outright removal
is unclear.

see issue #301

5 years agoCLEANUP: hpack: remove a redundant test in the decoder
Willy Tarreau [Wed, 5 Feb 2020 14:28:55 +0000 (15:28 +0100)] 
CLEANUP: hpack: remove a redundant test in the decoder

As reported in issue #485 the test for !len at the end of the
loop in get_var_int() is useless since it was already done inside
the loop. Actually the code is more readable if we remove the first
one so let's do this instead. The resulting code is exactly the same
since the compiler already optimized the test away.

5 years agoBUG/MINOR: ssl: clear the SSL errors on DH loading failure
William Lallemand [Wed, 5 Feb 2020 10:46:33 +0000 (11:46 +0100)] 
BUG/MINOR: ssl: clear the SSL errors on DH loading failure

In ssl_sock_load_dh_params(), if haproxy failed to apply the dhparam
with SSL_CTX_set_tmp_dh(), it will apply the DH with
SSL_CTX_set_dh_auto().

The problem is that we don't clean the OpenSSL errors when leaving this
function so it could fail to load the certificate, even if it's only a
warning.

Fixes bug #483.

Must be backported in 2.1.

5 years agoSCRIPTS: use /usr/bin/env bash instead of /bin/bash for scripts
Willy Tarreau [Wed, 5 Feb 2020 03:45:18 +0000 (04:45 +0100)] 
SCRIPTS: use /usr/bin/env bash instead of /bin/bash for scripts

Given that some OSes have bash in /usr/local/bin and in order not to
give too easy an excuse to Olivier for not backporting fixes, let's
make a few scripts rely on /usr/bin/env bash instead of /bin/bash :-)

5 years agoBUG/MINOR: ssl: we may only ignore the first 64 errors
Willy Tarreau [Tue, 4 Feb 2020 13:02:02 +0000 (14:02 +0100)] 
BUG/MINOR: ssl: we may only ignore the first 64 errors

We have the ability per bind option to ignore certain errors (CA, crt, ...),
and for this we use a 64-bit field. In issue #479 coverity reports a risk of
too large a left shift. For now as of OpenSSL 1.1.1 the highest error value
that may be reported by X509_STORE_CTX_get_error() seems to be around 50 so
there should be no risk yet, but it's enough of a warning to add a check so
that we don't accidently hide random errors in the future.

This may be backported to relevant stable branches.

5 years agoSCRIPTS: add a new "backport" script to simplify long series of backports
Willy Tarreau [Tue, 4 Feb 2020 12:50:36 +0000 (13:50 +0100)] 
SCRIPTS: add a new "backport" script to simplify long series of backports

The script is simply called from the repository holding the patch to
backport, with the last branch number and the commit(s) ID(s) to send
there and it then follows the chain of "down" repos to go down one step
until it meets the indicated last one. It basically automates what we do
by hand. Example:

   ./scripts/backport 1.9 1c7c0d6b97513e79c304aaf834f83843f32a674d

Note that it does *not* push, which still has to be done by hand after
building and testing.

5 years agoMINOR: ssl: ssl-load-extra-files configure loading of files
William Lallemand [Mon, 3 Feb 2020 16:15:52 +0000 (17:15 +0100)] 
MINOR: ssl: ssl-load-extra-files configure loading of files

This new setting in the global section alters the way HAProxy will look
for unspecified files (.ocsp, .sctl, .issuer, bundles) during the
loading of the SSL certificates.

By default, HAProxy discovers automatically a lot of files not specified
in the configuration, and you may want to disable this behavior if you
want to optimize the startup time.

This patch sets flags in global_ssl.extra_files and then check them
before trying to load an extra file.

5 years agoBUG/MAJOR: memory: Don't forget to unlock the rwlock if the pool is empty.
Olivier Houchard [Mon, 3 Feb 2020 12:03:30 +0000 (13:03 +0100)] 
BUG/MAJOR: memory: Don't forget to unlock the rwlock if the pool is empty.

In __pool_get_first(), don't forget to unlock the pool lock if the pool is
empty, otherwise no writer will be able to take the lock, and as it is done
when reloading, it leads to an infinite loop on reload.

This should be backported with commit 04f5fe87d3d3a222b89420f8c1231461f55ebdeb

5 years agoBUG/MEDIUM: memory: Add a rwlock before freeing memory.
Olivier Houchard [Sat, 1 Feb 2020 16:49:31 +0000 (17:49 +0100)] 
BUG/MEDIUM: memory: Add a rwlock before freeing memory.

When using lockless pools, add a new rwlock, flush_pool. read-lock it when
getting memory from the pool, so that concurrenct access are still
authorized, but write-lock it when we're about to free memory, in
pool_flush() and pool_gc().
The problem is, when removing an item from the pool, we unreference it
to get the next one, however, that pointer may have been free'd in the
meanwhile, and that could provoke a crash if the pointer has been unmapped.
It should be OK to use a rwlock, as normal operations will still be able
to access the pool concurrently, and calls to pool_flush() and pool_gc()
should be pretty rare.

This should be backported to 2.1, 2.0 and 1.9.

5 years agoMINOR: memory: Only init the pool spinlock once.
Olivier Houchard [Sat, 1 Feb 2020 16:45:32 +0000 (17:45 +0100)] 
MINOR: memory: Only init the pool spinlock once.

In pool_create(), only initialize the pool spinlock if we just created the
pool, in the event we're reusing it, there's no need to initialize it again.

5 years agoBUG/MEDIUM: memory_pool: Update the seq number in pool_flush().
Olivier Houchard [Sat, 1 Feb 2020 16:37:22 +0000 (17:37 +0100)] 
BUG/MEDIUM: memory_pool: Update the seq number in pool_flush().

In pool_flush(), we can't just set the free_list to NULL, or we may suffer
the ABA problem. Instead, use a double-width CAS and update the sequence
number.

This should be backported to 2.1, 2.0 and 1.9.
This may, or may not, be related to github issue #476.

5 years agoMINOR: task: don't set TASK_RUNNING on tasklets
Willy Tarreau [Fri, 31 Jan 2020 15:39:30 +0000 (16:39 +0100)] 
MINOR: task: don't set TASK_RUNNING on tasklets

We can't clear flags on tasklets because we don't know if they're still
present upon return (they all return NULL, maybe that could change in
the future). As a side effect, once TASK_RUNNING is set, it's never
cleared anymore, which is misleading and resulted in some incorrect
flagging of bulk tasks in the recent scheduler changes. And the only
reason for setting TASK_RUNNING on tasklets was to detect self-wakers,
which is not done using a dedicated flag. So instead of setting this
flags for no opportunity to clear it, let's simply not set it.

5 years agoOPTIM: task: readjust CPU bandwidth distribution since last update
Willy Tarreau [Fri, 31 Jan 2020 16:55:09 +0000 (17:55 +0100)] 
OPTIM: task: readjust CPU bandwidth distribution since last update

Now that we can more accurately watch which connection is really
being woken up from itself, it was desirable to re-adjust the CPU BW
thresholds based on measurements. New tests with 60000 concurrent
connections were run at 100 Gbps with unbounded queues and showed
the following distribution:

     scenario           TC0 TC1 TC2   observation
    -------------------+---+---+----+---------------------------
     TCP conn rate     : 32, 51, 17
     HTTP conn rate    : 34, 41, 25
     TCP byte rate     :  2,  3, 95   (2 MB objets)
     splicing byte rate: 11,  6, 83   (2 MB objets)
     H2 10k object     : 44, 23, 33   client-limited
     mixed traffic     : 18, 10, 72   2*1m+1*0: 11kcps, 36 Gbps

The H2 experienced a huge change since it uses a persistent connection
that was accidently flagged in the previous test. The splicing test
exhibits a higher need for short tasklets, so does the mixed traffic
test. Given that latency mainly matters for conn rate and H2 here,
the ratios were readjusted as 33% for TC0, 50% for TC1 and 17% for
TC2, keeping in mind that whatever is not consumed by one class is
automatically shared in equal propertions by the next one(s). This
setting immediately provided a nice improvement as with the default
settings (maxpollevents=200, runqueue-depth=200), the same ratios as
above are still reported, while the time to request "show activity"
on the CLI dropped to 30-50ms. The average loop time is around 5.7ms
on the mixed traffic.

In addition, one extra stress test at 90.5 Gbps with 5100 conn/s shows
70-100ms CLI request time, with an average loop time of 17 ms.

5 years agoMINOR: task: detect self-wakeups on tl==sched->current instead of TASK_RUNNING
Willy Tarreau [Fri, 31 Jan 2020 15:37:34 +0000 (16:37 +0100)] 
MINOR: task: detect self-wakeups on tl==sched->current instead of TASK_RUNNING

This is exactly what we want to detect (a task/tasklet waking itself),
so let's use the proper condition for this.

5 years agoMINOR: task: make sched->current also reflect tasklets
Willy Tarreau [Fri, 31 Jan 2020 09:39:03 +0000 (10:39 +0100)] 
MINOR: task: make sched->current also reflect tasklets

sched->current is used to know the current task/tasklet, and is currently
only used by the panic dump code. However it turns out it was not set for
tasklets, which prevents us from using it for more usages, despite the
panic handling code already handling this case very well. Let's make sure
it's now set.

5 years agoMINOR: task: permanently flag tasklets waking themselves up
Willy Tarreau [Fri, 31 Jan 2020 09:48:10 +0000 (10:48 +0100)] 
MINOR: task: permanently flag tasklets waking themselves up

Commit a17664d829 ("MEDIUM: tasks: automatically requeue into the bulk
queue an already running tasklet") tried to inflict a penalty to
self-requeuing tasks/tasklets which correspond to those involved in
large, high-latency data transfers, for the benefit of all other
processing which requires a low latency. However, it turns out that
while it ought to do this on a case-by-case basis, basing itself on
the RUNNING flag isn't accurate because this flag doesn't leave for
tasklets, so we'd rather need a distinct flag to tag such tasklets.

This commit introduces TASK_SELF_WAKING to mark tasklets acting like
this. For now it's still set when TASK_RUNNING is present but this
will have to change. The flag is kept across wakeups.

5 years agoBUG/MEDIUM: connections: Don't forget to unlock when killing a connection.
Olivier Houchard [Fri, 31 Jan 2020 16:22:08 +0000 (17:22 +0100)] 
BUG/MEDIUM: connections: Don't forget to unlock when killing a connection.

Commit 140237471e408736bb7162e68c572c710a66a526 made sure we hold the
toremove_lock for the corresponding thread before removing a connection
from its idle_orphan_conns list, however it failed to unlock it if we
found a connection, leading to a deadlock, so add the missing deadlock.

This should be backported to 2.1 and 2.0.

5 years agoOPTIM: task: refine task classes default CPU bandwidth ratios
Willy Tarreau [Fri, 31 Jan 2020 05:26:39 +0000 (06:26 +0100)] 
OPTIM: task: refine task classes default CPU bandwidth ratios

Measures with unbounded execution ratios under 40000 concurrent
connections at 100 Gbps showed the following CPU bandwidth
distribution between task classes depending on traffic scenarios:

    scenario           TC0 TC1 TC2   observation
   -------------------+---+---+----+---------------------------
    TCP conn rate     : 29, 48, 23   221 kcps
    HTTP conn rate    : 29, 47, 24   200 kcps
    TCP byte rate     :  3,  5, 92   53 Gbps
    splicing byte rate:  5, 10, 85   70 Gbps
    H2 10k object     : 10, 21, 74   client-limited
    mixed traffic     :  4,  7, 89   2*1m+1*0: 11kcps, 36 Gbps

Thus it seems that we always need a bit of bulk tasks even for short
connections, which seems to imply a suboptimal processing somewhere,
and that there are roughly twice as many tasks (TC1=normal) as regular
tasklets (TC0=urgent). This ratio stands even when data forwarding
increases. So at first glance it looks reasonable to enforce the
following ratio by default:

  - 16% for TL_URGENT
  - 33% for TL_NORMAL
  - 50% for TL_BULK

With this, the TCP conn rate climbs to ~225 kcps, and the mixed traffic
pattern shows a more balanced 17kcps + 35 Gbps with 35ms CLI request
time time instead of 11kcps + 36 Gbps and 400 ms response time. The
byte rate tests (1M objects) are not affected at all. This setting
looks "good enough" to allow immediate merging, and could be refined
later.

It's worth noting that it resists very well to massive increase of
run queue depth and maxpollevents: with the run queue depth changed
from 200 to 10000 and maxpollevents to 10000 as well, the CLI's
request time is back to the previous ~400ms, but the mixed traffic
test reaches 52 Gbps + 7500 CPS, which was never met with the previous
scheduling model, while the CLI used to show ~1 minute response time.
The reason is that in the bulk class it becomes possible to perform
multiple rounds of recv+send and eliminate objects at once, increasing
the L3 cache hit ratio, and keeping the connection count low, without
degrading too much the latency.

Another test with mixed traffic involving 2/3 splicing on huge objects
and 1/3 on empty objects without touching any setting reports 51 Gbps +
5300 cps and 35ms CLI request time.

5 years agoMEDIUM: tasks: automatically requeue into the bulk queue an already running tasklet
Willy Tarreau [Thu, 30 Jan 2020 17:59:43 +0000 (18:59 +0100)] 
MEDIUM: tasks: automatically requeue into the bulk queue an already running tasklet

When a tasklet re-runs itself such as in this chain:

   si_cs_io_cb -> si_cs_process -> si_notify -> si_chk_rcv

then we know it can easily clobber the run queue and harm latency. Now
what the scheduler does when it detects this is that such a tasklet is
automatically placed into the bulk list so that it's processed with the
remaining CPU bandwidth only. Thanks to this the CLI becomes instantly
responsive again even under heavy stress at 50 Gbps over 40kcon and
100% CPU on 16 threads.

5 years agoMEDIUM: tasks: implement 3 different tasklet classes with their own queues
Willy Tarreau [Thu, 30 Jan 2020 17:37:28 +0000 (18:37 +0100)] 
MEDIUM: tasks: implement 3 different tasklet classes with their own queues

We used to mix high latency tasks and low latency tasklets in the same
list, and to even refill bulk tasklets there, causing some unfairness
in certain situations (e.g. poll-less transfers between many connections
saturating the machine with similarly-sized in and out network interfaces).

This patch changes the mechanism to split the load into 3 lists depending
on the task/tasklet's desired classes :
  - URGENT: this is mainly for tasklets used as deferred callbacks
  - NORMAL: this is for regular tasks
  - BULK: this is for bulk tasks/tasklets

Arbitrary ratios of max_processed are picked from each of these lists in
turn, with the ability to complete in one list from what was not picked
in the previous one. After some quick tests, the following setup gave
apparently good results both for raw TCP with splicing and for H2-to-H1
request rate:

  - 0 to 75% for urgent
  - 12 to 50% for normal
  - 12 to what remains for bulk

Bulk is not used yet.

5 years agoMINOR: tasks: move the list walking code to its own function
Willy Tarreau [Thu, 30 Jan 2020 17:13:13 +0000 (18:13 +0100)] 
MINOR: tasks: move the list walking code to its own function

New function run_tasks_from_list() will run over a tasklet list and will
run all the tasks and tasklets it finds there within a limit of <max>
that is passed in arggument. This is a preliminary work for scheduler QoS
improvements.

5 years agoBUG/MEDIUM: pipe/thread: fix atomicity of pipe counters
Willy Tarreau [Thu, 30 Jan 2020 08:15:37 +0000 (09:15 +0100)] 
BUG/MEDIUM: pipe/thread: fix atomicity of pipe counters

Previous patch 160287b676 ("MEDIUM: pipe/thread: maintain a per-thread
local cache of recently used pipes") didn't replace all pipe counter
updates with atomic ops since some were already under a lock, which is
obviously not a valid reason since these ones can be updated in parallel
to other atomic ops. The result was that the pipes_used could seldom be
seen as negative in the stats (harmless) but also this could result in
slightly more pipes being allocated than permitted, thus stealing a few
file descriptors that were not usable for connections anymore. Let's use
pure atomic ops everywhere these counters are updated.

No backport is needed.

5 years agoMEDIUM: pipe/thread: maintain a per-thread local cache of recently used pipes
Willy Tarreau [Wed, 29 Jan 2020 10:05:50 +0000 (11:05 +0100)] 
MEDIUM: pipe/thread: maintain a per-thread local cache of recently used pipes

In order to completely remove the pipe locking cost and try to reuse
hot pipes, each thread now maintains a local cache of recently used pipes
that is no larger than its share (maxpipes/nbthreads). All extra pipes
are instead refilled into the global pool. Allocations are made from the
local pool first, and fall back to the global one before allocating one.
This completely removes the observed pipe locking cost at high bit rates,
which was still around 5-6%.

5 years agoMEDIUM: pipe/thread: reduce the locking overhead
Willy Tarreau [Wed, 29 Jan 2020 09:41:34 +0000 (10:41 +0100)] 
MEDIUM: pipe/thread: reduce the locking overhead

In a quick test involving splicing, we can see that get_pipe() and
put_pipe() together consume up to 12% of the CPU. That's not surprizing
considering how much work is performed under the lock, including the
pipe struct allocation, the pipe creation and its initialization. Same
for releasing, we don't need a lock there to call close() nor to free
to the pool.

Changing this alone was enough to cut the overhead in half. A better
approach should consist in having a per-thread pipe cache, which will
also help keep pages hot in the CPU caches.

5 years agoBUG/MINOR: ssl/cli: fix unused variable with openssl < 1.0.2
William Lallemand [Tue, 28 Jan 2020 23:04:24 +0000 (00:04 +0100)] 
BUG/MINOR: ssl/cli: fix unused variable with openssl < 1.0.2

src/ssl_sock.c: In function ‘cli_io_handler_show_cert’:
src/ssl_sock.c:10214:6: warning: unused variable ‘n’ [-Wunused-variable]
  int n;
      ^
Fix this problem in the io handler of the "show ssl cert" function.

5 years agoMEDIUM: raw-sock: remove obsolete calls to fd_{cant,cond,done}_{send,recv}
Willy Tarreau [Tue, 28 Jan 2020 17:51:57 +0000 (18:51 +0100)] 
MEDIUM: raw-sock: remove obsolete calls to fd_{cant,cond,done}_{send,recv}

Given that raw_sock's functions solely act on connections and that all its
callers properly use subscribe() when they want to receive/send more, there
is no more reason for calling fd_{cant,cond,done}_{send,recv} anymore as
this call is immediately overridden by the subscribe call. It's also worth
noting that the purpose of fd_cond_recv() whose purpose was to speculatively
enable reading in the FD cache if the FD was active but not yet polled was
made to save on expensive epoll_ctl() calls and was implicitly covered more
cleanly by recent commit 5d7dcc2a8e ("OPTIM: epoll: always poll for recv if
neither active nor ready").

No change on the number of calls to epoll_ctl() was noticed consecutive to
this change.

5 years agoDOC: word converter ignores delimiters at the start or end of input string
Jerome Magnin [Tue, 28 Jan 2020 12:33:44 +0000 (13:33 +0100)] 
DOC: word converter ignores delimiters at the start or end of input string

The comments for match_word() in pattern.c mention that delimiters
at the start or end of the input string will be ignored, but this
is not mentionned in the documentation.

Backport to all supported versions.

5 years agoMINOR: proxy: clarify number of connections log when stopping
William Dauchy [Sat, 25 Jan 2020 22:45:18 +0000 (23:45 +0100)] 
MINOR: proxy: clarify number of connections log when stopping

this log could be sometimes a bit confusing (depending on the number in
fact) when you read it (e.g is it the number of active connection?) -
only trained eyes knows haproxy output a different log when closing
active connections while stopping.

Signed-off-by: William Dauchy <w.dauchy@criteo.com>
5 years agoBUG/MINOR: dns: allow 63 char in hostname
William Dauchy [Sun, 26 Jan 2020 18:52:34 +0000 (19:52 +0100)] 
BUG/MINOR: dns: allow 63 char in hostname

hostname were limited to 62 char, which is not RFC1035 compliant;
- the parsing loop should stop when above max label char
- fix len label test where d[i] was wrongly used
- simplify the whole function to avoid using two extra char* variable

this should fix github issue #387

Signed-off-by: William Dauchy <w.dauchy@criteo.com>
Reviewed-by: Tim Duesterhus <tim@bastelstu.be>
Acked-by: Baptiste <bedis9@gmail.com>
5 years agoBUG/MINOR: connection: fix ip6 dst_port copy in make_proxy_line_v2
William Dauchy [Sun, 26 Jan 2020 18:06:39 +0000 (19:06 +0100)] 
BUG/MINOR: connection: fix ip6 dst_port copy in make_proxy_line_v2

triggered by coverity; src_port is set earlier.

this should fix github issue #467

Fixes: 7fec02153712 ("MEDIUM: proxy_protocol: Convert IPs to v6 when
protocols are mixed")
This should be backported to 1.8.

Signed-off-by: William Dauchy <w.dauchy@criteo.com>
Reviewed-by: Tim Duesterhus <tim@bastelstu.be>
5 years agoBUG/MINOR: http-rules: Always init log-format expr for common HTTP actions
Christopher Faulet [Mon, 27 Jan 2020 14:51:56 +0000 (15:51 +0100)] 
BUG/MINOR: http-rules: Always init log-format expr for common HTTP actions

Many HTTP actions rely on <.arg.http> in the act_rule structure. Not all actions
use the log-format expression, but it must be initialized anyway. Otherwise,
HAProxy may crash during the deinit when the release function is called.

No backport needed. This patch should fix issue #468.

5 years agoBUG/MINOR: tcpchecks: fix the connect() flags regarding delayed ack
Willy Tarreau [Fri, 24 Jan 2020 16:52:37 +0000 (17:52 +0100)] 
BUG/MINOR: tcpchecks: fix the connect() flags regarding delayed ack

In issue #465, we see that Coverity detected dead code in checks.c
which is in fact a missing parenthesis to build the connect() flags
consecutive to the API change in commit fdcb007ad8 ("MEDIUM: proto:
Change the prototype of the connect() method.").

The impact should be imperceptible as in the best case it may have
resulted in a missed optimization trying to save a syscall or to merge
outgoing packets.

It may be backported as far as 2.0 though it's not critical.

5 years agoBUILD: CI: disable slow regtests on Travis
Willy Tarreau [Fri, 24 Jan 2020 16:37:35 +0000 (17:37 +0100)] 
BUILD: CI: disable slow regtests on Travis

We're getting almost 100% failure rate recently due to the "slow" tests
never completing in time on Travis. Peers do not synchronize their data
within the expected delay, health checks time out due to the tested
agent not responding, etc. This adds a lot of noise and completely voids
the value of the build test.

Let's disable the slow tests to try to get back to a fully working state.

5 years agoMEDIUM: streams: Don't close the connection in back_handle_st_rdy().
Olivier Houchard [Fri, 24 Jan 2020 14:24:32 +0000 (15:24 +0100)] 
MEDIUM: streams: Don't close the connection in back_handle_st_rdy().

In back_handle_st_rdy(), don't bother trying to close the connection, it
should be taken care of somewhere else.

5 years agoMEDIUM: streams: Don't close the connection in back_handle_st_con().
Olivier Houchard [Fri, 24 Jan 2020 14:37:37 +0000 (15:37 +0100)] 
MEDIUM: streams: Don't close the connection in back_handle_st_con().

In back_handle_st_con(), don't bother trying to close the connection, it
should be taken care of elsewhere.

5 years agoBUG/MEDIUM: stream: Don't install the mux in back_handle_st_con().
Olivier Houchard [Fri, 24 Jan 2020 14:36:38 +0000 (15:36 +0100)] 
BUG/MEDIUM: stream: Don't install the mux in back_handle_st_con().

In back_handle_st_con(), don't bother setting up the mux, it is now done by
conn_fd_handler().

5 years agoBUG/MEDIUM: ssl: Don't forget to free ctx->ssl on failure.
Olivier Houchard [Fri, 24 Jan 2020 14:17:38 +0000 (15:17 +0100)] 
BUG/MEDIUM: ssl: Don't forget to free ctx->ssl on failure.

In ssl_sock_init(), if we fail to allocate the BIO, don't forget to free
the SSL *, or we'd end up with a memory leak.

This should be backported to 2.1 and 2.0.

5 years agoMINOR: ssl: Remove dead code.
Olivier Houchard [Fri, 24 Jan 2020 14:13:57 +0000 (15:13 +0100)] 
MINOR: ssl: Remove dead code.

Now that we don't call the handshake function directly, but merely wake
the tasklet, we can no longer have CO_FL_ERR, so don't bother checking it.

5 years agoBUG/MINOR: ssl: Possible memleak when allowing the 0RTT data buffer.
Frédéric Lécaille [Fri, 24 Jan 2020 13:56:18 +0000 (14:56 +0100)] 
BUG/MINOR: ssl: Possible memleak when allowing the 0RTT data buffer.


As the server early data buffer is allocated in the middle of the loop
used to allocate the SSL session without being freed before retrying,
this leads to a memory leak.

To fix this we move the section of code responsible of this early data buffer
alloction after the one reponsible of allocating the SSL session.

Must be backported to 2.1 and 2.0.

5 years agoREGTESTS: make the set_ssl_cert test require version 2.2
Willy Tarreau [Fri, 24 Jan 2020 12:49:42 +0000 (13:49 +0100)] 
REGTESTS: make the set_ssl_cert test require version 2.2

It doesn't only use "set ssl cert" but also relies on "show ssl cert"
which is only available in 2.2.

5 years agoBUG/MEDIUM: streams: Move the conn_stream allocation outside #IF USE_OPENSSL.
Olivier Houchard [Fri, 24 Jan 2020 13:10:55 +0000 (14:10 +0100)] 
BUG/MEDIUM: streams: Move the conn_stream allocation outside #IF USE_OPENSSL.

When commit 477902bd2e8c1e978ad43d22dba1f28525bb797a made the conn_stream
allocation unconditional, it unfortunately moved the code doing the allocation
inside #if USE_OPENSSL, which means anybody compiling haproxy without
openssl wouldn't allocate any conn_stream, and would get a segfault later.
Fix that by moving the code that does the allocation outside #if USE_OPENSSL.

5 years agoBUG/MINOR: stream: Be sure to have a listener to increment its counters
Christopher Faulet [Fri, 24 Jan 2020 10:45:05 +0000 (11:45 +0100)] 
BUG/MINOR: stream: Be sure to have a listener to increment its counters

In process_stream(), when a client or a server abort is handled, the
corresponding listener's counter is incremented. But, we must be sure to have a
listener attached to the session. This bug was introduced by the commit
cff0f739e51.

Thanks to Fred to reporting me the bug.

No need to backport this patch, except if commit cff0f739e51 is backported.

5 years agoBUG/MINOR: http-ana: Increment the backend counters on the backend
Christopher Faulet [Fri, 24 Jan 2020 10:41:38 +0000 (11:41 +0100)] 
BUG/MINOR: http-ana: Increment the backend counters on the backend

A stupid cut-paste bug was introduced in the commit cff0f739e51. Backend
counters must of course be incremented on the stream's backend. Not the
frontend.

No need to backport this patch, except if commit cff0f739e51 is backported.

5 years agoBUILD: cfgparse: silence a bogus gcc warning on 32-bit machines
Willy Tarreau [Fri, 24 Jan 2020 10:19:13 +0000 (11:19 +0100)] 
BUILD: cfgparse: silence a bogus gcc warning on 32-bit machines

A first patch was made during 2.0-dev to silence a bogus warning emitted
by gcc : dd1c8f1f72 ("MINOR: cfgparse: Add a cast to make gcc happier."),
but it happens it was not sufficient as the warning re-appeared on 32-bit
machines under gcc-8 and gcc-9 :

  src/cfgparse.c: In function 'check_config_validity':
  src/cfgparse.c:3642:33: warning: argument 1 range [21474836484294967295] exceeds maximum object size 2147483647 [-Walloc-size-larger-than=]
       newsrv->idle_orphan_conns = calloc((unsigned int)global.nbthread, sizeof(*newsrv->idle_orphan_conns));
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This warning doesn't trigger in other locations, and it immediately
vanishes if the previous or subsequent loops do not depend on
global.nbthread anymore, or if the field ordering of the struct server
changes! As discussed in the thread at:

   https://www.mail-archive.com/haproxy@formilux.org/msg36107.html

playing with -Walloc-size-larger-than has no effect. And a minimal
reproducer could be isolated, indicating it's pointless to circle around
this one. Let's just cast nbthread to ushort so that gcc cannot make
this wrong detection. It's unlikely we'll use more than 65535 threads in
the near future anyway.

This may be backported to older releases if they are also affected, at
least to ease the job of distro maintainers.

Thanks to Ilya for testing.

5 years agoMINOR: lua: Add HLUA_PREPEND_C?PATH build option
Tim Duesterhus [Sun, 12 Jan 2020 12:55:41 +0000 (13:55 +0100)] 
MINOR: lua: Add HLUA_PREPEND_C?PATH build option

This complements the lua-prepend-path configuration option to allow
distro maintainers to add a default path for HAProxy specific Lua
libraries.

5 years agoMINOR: lua: Add lua-prepend-path configuration option
Tim Duesterhus [Sun, 12 Jan 2020 12:55:40 +0000 (13:55 +0100)] 
MINOR: lua: Add lua-prepend-path configuration option

lua-prepend-path allows the administrator to specify a custom Lua library
path to load custom Lua modules that are useful within the context of HAProxy
without polluting the global Lua library folder.

5 years agoMINOR: lua: Add hlua_prepend_path function
Tim Duesterhus [Sun, 12 Jan 2020 12:55:39 +0000 (13:55 +0100)] 
MINOR: lua: Add hlua_prepend_path function

This function is added in preparation for following patches.

5 years agoBUG/MEDIUM: mux-h2: make sure we don't emit TE headers with anything but "trailers"
Willy Tarreau [Fri, 24 Jan 2020 08:07:53 +0000 (09:07 +0100)] 
BUG/MEDIUM: mux-h2: make sure we don't emit TE headers with anything but "trailers"

While the H2 parser properly checks for the absence of anything but
"trailers" in the TE header field, we forget to check this when sending
the request to an H2 server. The problem is that an H2->H2 conversion
may keep "gzip" and fail on the next stage.

This patch makes sure that we only send "TE: trailers" if the TE header
contains the "trailers" token, otherwise it's dropped.

This fixes issue #464 and should be backported till 1.9.

5 years agoBUG/MINOR: stktable: report the current proxy name in error messages
Willy Tarreau [Fri, 24 Jan 2020 06:19:34 +0000 (07:19 +0100)] 
BUG/MINOR: stktable: report the current proxy name in error messages

Since commit 1b8e68e89a ("MEDIUM: stick-table: Stop handling stick-tables
as proxies."), a rule referencing the current proxy with no table leads
to the following error :

  [ALERT] 023/071924 (16479) : Proxy 'px': unable to find stick-table '(null)'.
  [ALERT] 023/071914 (16479) : Fatal errors found in configuration.

for a config like this one:

  backend px
        stick on src

This patch fixes it and should be backported as far as 2.0.

5 years agoMINOR: connection: remove some unneeded checks for CO_FL_SOCK_WR_SH
Willy Tarreau [Thu, 23 Jan 2020 17:25:23 +0000 (18:25 +0100)] 
MINOR: connection: remove some unneeded checks for CO_FL_SOCK_WR_SH

A few places in health checks and stream-int on the send path were still
checking for this flag. Now we do not and instead we rely on snd_buf()
to report the error if any.

It's worth noting that all 3 real muxes still use CO_FL_SOCK_WR_SH and
CO_FL_ERROR interchangeably at various places to decide to abort and/or
free their data. This should be clarified and fixed so that only
CO_FL_ERROR is used, and this will render the error paths simpler and
more accurate.

5 years agoMINOR: raw-sock: always check for CO_FL_SOCK_WR_SH before sending
Willy Tarreau [Thu, 23 Jan 2020 17:17:55 +0000 (18:17 +0100)] 
MINOR: raw-sock: always check for CO_FL_SOCK_WR_SH before sending

The test was added before splice() and send() to make sure we never
accidently send after a shutdown, because upper layers do not all
check and it's not their job to do it. In such a case we also set
errno to EPIPE so that the error can be accurately reported, e.g.,
in health checks.

5 years agoMINOR: connection: don't check for CO_FL_SOCK_WR_SH too early in handshakes
Willy Tarreau [Thu, 23 Jan 2020 17:08:45 +0000 (18:08 +0100)] 
MINOR: connection: don't check for CO_FL_SOCK_WR_SH too early in handshakes

Just like with CO_FL_SOCK_RD_SH, we don't need to check for this flag too
early because conn_sock_send() already does it. No error was lost so it
was harmless, it was only useless code.

5 years agoMINOR: connection: do not check for CO_FL_SOCK_RD_SH too early
Willy Tarreau [Thu, 23 Jan 2020 17:05:18 +0000 (18:05 +0100)] 
MINOR: connection: do not check for CO_FL_SOCK_RD_SH too early

The handshake functions dedicated to proxy proto, netscaler and
socks4 all check for this flag before proceeding. This is wrong,
they must not do and instead perform the call to recv() then
report the close. The reason for this is that the current
construct managed to lose the CO_ER_CIP_EMPTY error code in case
the connection was already shut, thus causing a race condition
with some errors being reported correctly or as unknown depending
on the timing.

5 years agoMINOR: connection: remove checks for CO_FL_HANDSHAKE before I/O
Willy Tarreau [Thu, 23 Jan 2020 16:30:42 +0000 (17:30 +0100)] 
MINOR: connection: remove checks for CO_FL_HANDSHAKE before I/O

There are still leftovers from the pre-xprt_handshake era with lots
of places where I/O callbacks refrain from receiving/sending if they
see that a handshake is present. This needlessly duplicates the
subscribe calls as it will automatically be done by the underlying
xprt_handshake code when attempting the operation.

The only reason for still checking CO_FL_HANDSHAKE is when we decide
to instantiate xprt_handshake. This patch removes all other ones.

5 years agoMEDIUM: connection: use CO_FL_WAIT_XPRT more consistently than L4/L6/HANDSHAKE
Willy Tarreau [Thu, 23 Jan 2020 15:27:54 +0000 (16:27 +0100)] 
MEDIUM: connection: use CO_FL_WAIT_XPRT more consistently than L4/L6/HANDSHAKE

As mentioned in commit c192b0ab95 ("MEDIUM: connection: remove
CO_FL_CONNECTED and only rely on CO_FL_WAIT_*"), there is a lack of
consistency on which flags are checked among L4/L6/HANDSHAKE depending
on the code areas. A number of sample fetch functions only check for
L4L6 to report MAY_CHANGE, some places only check for HANDSHAKE and
many check both L4L6 and HANDSHAKE.

This patch starts to make all of this more consistent by introducing a
new mask CO_FL_WAIT_XPRT which is the union of L4/L6/HANDSHAKE and
reports whether the transport layer is ready or not.

All inconsistent call places were updated to rely on this one each time
the goal was to check for the readiness of the transport layer.

5 years agoMINOR: connection: remove CO_FL_SSL_WAIT_HS from CO_FL_HANDSHAKE
Willy Tarreau [Thu, 23 Jan 2020 14:23:13 +0000 (15:23 +0100)] 
MINOR: connection: remove CO_FL_SSL_WAIT_HS from CO_FL_HANDSHAKE

Most places continue to check CO_FL_HANDSHAKE while in fact they should
check CO_FL_HANDSHAKE_NOSSL, which contains all handshakes but the one
dedicated to SSL renegotiation. In fact the SSL layer should be the
only one checking CO_FL_SSL_WAIT_HS, so as to avoid processing data
when a renegotiation is in progress, but other ones randomly include it
without knowing. And ideally it should even be an internal flag that's
not exposed in the connection.

This patch takes CO_FL_SSL_WAIT_HS out of CO_FL_HANDSHAKE, uses this flag
consistently all over the code, and gets rid of CO_FL_HANDSHAKE_NOSSL.

In order to limit the confusion that has accumulated over time, the
CO_FL_SSL_WAIT_HS flag which indicates an ongoing SSL handshake,
possibly used by a renegotiation was moved after the other ones.

5 years agoMINOR: stream-int: always report received shutdowns
Willy Tarreau [Thu, 23 Jan 2020 15:32:24 +0000 (16:32 +0100)] 
MINOR: stream-int: always report received shutdowns

As mentioned in c192b0ab95 ("MEDIUM: connection: remove CO_FL_CONNECTED
and only rely on CO_FL_WAIT_*"), si_cs_recv() currently does not propagate
CS_FL_EOS to CF_READ_NULL if CO_FL_WAIT_L4L6 is set, while this situation
doesn't exist anymore. Let's get rid of this confusing test.

5 years agoBUG/MEDIUM: 0rtt: Only consider the SSL handshake.
Olivier Houchard [Thu, 23 Jan 2020 13:57:36 +0000 (14:57 +0100)] 
BUG/MEDIUM: 0rtt: Only consider the SSL handshake.

We only add the Early-data header, or get ssl_fc_has_early to return 1, if
we didn't already did the SSL handshake, as otherwise, we know the early
data were fine, and there's no risk of replay attack. But to do so, we
wrongly checked CO_FL_HANDSHAKE, we have to check CO_FL_SSL_WAIT_HS instead,
as we don't care about the status of any other handshake.

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

When deciding if we should add the Early-Data header, or if the sample fetch
should return

5 years agoMEDIUM: connection: remove CO_FL_CONNECTED and only rely on CO_FL_WAIT_*
Willy Tarreau [Thu, 23 Jan 2020 08:11:58 +0000 (09:11 +0100)] 
MEDIUM: connection: remove CO_FL_CONNECTED and only rely on CO_FL_WAIT_*

Commit 477902bd2e ("MEDIUM: connections: Get ride of the xprt_done
callback.") broke the master CLI for a very obscure reason. It happens
that short requests immediately terminated by a shutdown are properly
received, CS_FL_EOS is correctly set, but in si_cs_recv(), we refrain
from setting CF_SHUTR on the channel because CO_FL_CONNECTED was not
yet set on the connection since we've not passed again through
conn_fd_handler() and it was not done in conn_complete_session(). While
commit a8a415d31a ("BUG/MEDIUM: connections: Set CO_FL_CONNECTED in
conn_complete_session()") fixed the issue, such accident may happen
again as the root cause is deeper and actually comes down to the fact
that CO_FL_CONNECTED is lazily set at various check points in the code
but not every time we drop one wait bit. It is not the first time we
face this situation.

Originally this flag was used to detect the transition between WAIT_*
and CONNECTED in order to call ->wake() from the FD handler. But since
at least 1.8-dev1 with commit 7bf3fa3c23 ("BUG/MAJOR: connection: update
CO_FL_CONNECTED before calling the data layer"), CO_FL_CONNECTED is
always synchronized against the two others before being checked. Moreover,
with the I/Os moved to tasklets, the decision to call the ->wake() function
is performed after the I/Os in si_cs_process() and equivalent, which don't
care about this transition either.

So in essence, checking for CO_FL_CONNECTED has become a lazy wait to
check for (CO_FL_WAIT_L4_CONN | CO_FL_WAIT_L6_CONN), but that always
relies on someone else having synchronized it.

This patch addresses it once for all by killing this flag and only checking
the two others (for which a composite mask CO_FL_WAIT_L4L6 was added). This
revealed a number of inconsistencies that were purposely not addressed here
for the sake of bisectability:

  - while most places do check both L4+L6 and HANDSHAKE at the same time,
    some places like assign_server() or back_handle_st_con() and a few
    sample fetches looking for proxy protocol do check for L4+L6 but
    don't care about HANDSHAKE ; these ones will probably fail on TCP
    request session rules if the handshake is not complete.

  - some handshake handlers do validate that a connection is established
    at L4 but didn't clear CO_FL_WAIT_L4_CONN

  - the ->ctl method of mux_fcgi, mux_pt and mux_h1 only checks for L4+L6
    before declaring the mux ready while the snd_buf function also checks
    for the handshake's completion. Likely the former should validate the
    handshake as well and we should get rid of these extra tests in snd_buf.

  - raw_sock_from_buf() would directly set CO_FL_CONNECTED and would only
    later clear CO_FL_WAIT_L4_CONN.

  - xprt_handshake would set CO_FL_CONNECTED itself without actually
    clearing CO_FL_WAIT_L4_CONN, which could apparently happen only if
    waiting for a pure Rx handshake.

  - most places in ssl_sock that were checking CO_FL_CONNECTED don't need
    to include the L4 check as an L6 check is enough to decide whether to
    wait for more info or not.

It also becomes obvious when reading the test in si_cs_recv() that caused
the failure mentioned above that once converted it doesn't make any sense
anymore: having CS_FL_EOS set while still waiting for L4 and L6 to complete
cannot happen since for CS_FL_EOS to be set, the other ones must have been
validated.

Some of these parts will still deserve further cleanup, and some of the
observations above may induce some backports of potential bug fixes once
totally analyzed in their context. The risk of breaking existing stuff
is too high to blindly backport everything.

5 years agoBUG/MINOR: ssl/cli: ocsp_issuer must be set w/ "set ssl cert"
Emmanuel Hocdet [Wed, 22 Jan 2020 16:02:53 +0000 (17:02 +0100)] 
BUG/MINOR: ssl/cli: ocsp_issuer must be set w/ "set ssl cert"

ocsp_issuer is primary set from ckch->chain when PEM is loaded from file,
but not set when PEM is loaded via CLI payload. Set ckch->ocsp_issuer in
ssl_sock_load_pem_into_ckch to fix that.

Should be backported in 2.1.

5 years agoBUG/MEDIUM: connections: Set CO_FL_CONNECTED in conn_complete_session().
Olivier Houchard [Thu, 23 Jan 2020 12:15:14 +0000 (13:15 +0100)] 
BUG/MEDIUM: connections: Set CO_FL_CONNECTED in conn_complete_session().

We can't just assume conn_create_mux() will be called, and set CO_FL_CONNECTED,
conn_complete_session() might be call synchronously if we're not using SSL,
so ew haee no choice but to set CO_FL_CONNECTED in there. This should fix
the recent breakage of the mcli reg tests.

5 years agoBUG/MINOR: ssl: typo in previous patch
William Lallemand [Thu, 23 Jan 2020 10:59:02 +0000 (11:59 +0100)] 
BUG/MINOR: ssl: typo in previous patch

The previous patch 5c3c96f ("BUG/MINOR: ssl: memory leak w/ the
ocsp_issuer") contains a typo that prevent it to build.

Should be backported in 2.1.