]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
8 years agoCONTRIB: tcploop: use the trash instead of NULL for recv()
Willy Tarreau [Tue, 14 Mar 2017 13:50:52 +0000 (14:50 +0100)] 
CONTRIB: tcploop: use the trash instead of NULL for recv()

NULL is Linux-centric and we're not focused on performance here but
portability and reproducibility. Don't use NULL and use the trash
instead. It may lead to multiple recv() calls for large blocks but
as a benefit it will be possible to see the contents with strace.

8 years agoCONTRIB: tcploop: fix connect's address length
Willy Tarreau [Tue, 14 Mar 2017 13:50:05 +0000 (14:50 +0100)] 
CONTRIB: tcploop: fix connect's address length

FreeBSD wants the address size to be correct, so let's pass the size
of a sockaddr_in struct, not the sockaddr_storage.

8 years agoCONTRIB: tcploop: report action 'K' (kill) in usage message
Willy Tarreau [Tue, 14 Mar 2017 13:44:06 +0000 (14:44 +0100)] 
CONTRIB: tcploop: report action 'K' (kill) in usage message

It was missing from the initial import.

8 years agoCONTRIB: tcploop: fix time format to silence build warnings
Willy Tarreau [Tue, 14 Mar 2017 13:37:13 +0000 (14:37 +0100)] 
CONTRIB: tcploop: fix time format to silence build warnings

timeval doesn't necessarily have ints for tv_sec/tv_usec, let's cast
them.

8 years agoCONTRIB: tcploop: make it build on FreeBSD
Willy Tarreau [Tue, 14 Mar 2017 13:36:26 +0000 (14:36 +0100)] 
CONTRIB: tcploop: make it build on FreeBSD

A few changes :
- SOL_TCP must be replaced with IPPROTO_TCP
- TCP_NOQUICKACK is not defined
- MSG_MORE can be ignored and replaced with 0

8 years agoBUG/MINOR: checks: attempt clean shutw for SSL check
Steven Davidovitz [Wed, 8 Mar 2017 19:06:20 +0000 (11:06 -0800)] 
BUG/MINOR: checks: attempt clean shutw for SSL check

Strict interpretation of TLS can cause SSL sessions to be thrown away
when the socket is shutdown without sending a "close notify", resulting
in each check to go through the complete handshake, eating more CPU on
the servers.

[wt: strictly speaking there's no guarantee that the close notify will
 be delivered, it's only best effort, but that may be enough to ensure
 that once at least one is received, next checks will be cheaper. This
 should be backported to 1.7 and possibly 1.6]

8 years agoMINOR: cli: Let configure the dynamic cookies from the cli.
Olivier Houchard [Tue, 14 Mar 2017 19:08:46 +0000 (20:08 +0100)] 
MINOR: cli: Let configure the dynamic cookies from the cli.

This adds 3 new commands to the cli :
enable dynamic-cookie backend <backend> that enables dynamic cookies for a
specified backend
disable dynamic-cookie backend <backend> that disables dynamic cookies for a
specified backend
set dynamic-cookie-key backend <backend> that lets one change the dynamic
cookie secret key, for a specified backend.

8 years agoMINOR: server: Add dynamic session cookies.
Olivier Houchard [Tue, 14 Mar 2017 19:01:29 +0000 (20:01 +0100)] 
MINOR: server: Add dynamic session cookies.

This adds a new "dynamic" keyword for the cookie option. If set, a cookie
will be generated for each server (assuming one isn't already provided on
the "server" line), from the IP of the server, the TCP port, and a secret
key provided. To provide the secret key, a new keyword as been added,
"dynamic-cookie-key", for backends.

Example :
backend bk_web
  balance roundrobin
  dynamic-cookie-key "bla"
  cookie WEBSRV insert dynamic
  server s1 127.0.0.1:80 check
  server s2 192.168.56.1:80 check

This is a first step to be able to dynamically add and remove servers,
without modifying the configuration file, and still have all the load
balancers redirect the traffic to the right server.

Provide a way to generate session cookies, based on the IP address of the
server, the TCP port, and a secret key provided.

8 years agoBUG/MAJOR: connection: update CO_FL_CONNECTED before calling the data layer
Willy Tarreau [Tue, 14 Mar 2017 19:19:29 +0000 (20:19 +0100)] 
BUG/MAJOR: connection: update CO_FL_CONNECTED before calling the data layer

Matthias Fechner reported a regression in 1.7.3 brought by the backport
of commit 819efbf ("BUG/MEDIUM: tcp: don't poll for write when connect()
succeeds"), causing some connections to fail to establish once in a while.
While this commit itself was a fix for a bad sequencing of connection
events, it in fact unveiled a much deeper bug going back to the connection
rework era in v1.5-dev12 : 8f8c92f ("MAJOR: connection: add a new
CO_FL_CONNECTED flag").

It's worth noting that in a lab reproducing a similar environment as
Matthias' about only 1 every 19000 connections exhibit this behaviour,
making the issue not so easy to observe. A trick to make the problem
more observable consists in disabling non-blocking mode on the socket
before calling connect() and re-enabling it later, so that connect()
always succeeds. Then it becomes 100% reproducible.

The problem is that this CO_FL_CONNECTED flag is tested after deciding to
call the data layer (typically the stream interface but might be a health
check as well), and that the decision to call the data layer relies on a
change of one of the flags covered by the CO_FL_CONN_STATE set, which is
made of CO_FL_CONNECTED among others.

Before the fix above, this bug couldn't appear with TCP but it could
appear with Unix sockets. Indeed, connect() was always considered
blocking so the CO_FL_WAIT_L4_CONN connection flag was always set, and
polling for write events was always enabled. This used to guarantee that
the conn_fd_handler() could detect a change among the CO_FL_CONN_STATE
flags.

Now with the fix above, if a connect() immediately succeeds for non-ssl
connection with send-proxy enabled, and no data in the buffer (thus TCP
mode only), the CO_FL_WAIT_L4_CONN flag is not set, the lack of data in
the buffer doesn't enable polling flags for the data layer, the
CO_FL_CONNECTED flag is not set due to send-proxy still being pending,
and once send-proxy is done, its completion doesn't cause the data layer
to be woken up due to the fact that CO_FL_CONNECT is still not present
and that the CO_FL_SEND_PROXY flag is not watched in CO_FL_CONN_STATE.

Then no progress is made when data are received from the client (and
attempted to be forwarded), because a CF_WRITE_NULL (or CF_WRITE_PARTIAL)
flag is needed for the stream-interface state to turn from SI_ST_CON to
SI_ST_EST, allowing ->chk_snd() to be called when new data arrive. And
the only way to set this flag is to call the data layer of course.

After the connect timeout, the connection gets killed and if in the mean
time some data have accumulated in the buffer, the retry will succeed.

This patch fixes this situation by simply placing the update of
CO_FL_CONNECTED where it should have been, before the check for a flag
change needed to wake up the data layer and not after.

This fix must be backported to 1.7, 1.6 and 1.5. Versions not having
the patch above are still affected for unix sockets.

Special thanks to Matthias Fechner who provided a very detailed bug
report with a bisection designating the faulty patch, and to Olivier
Houchard for providing full access to a pretty similar environment where
the issue could first be reproduced.

8 years agoMEDIUM: stats: Add show json schema
Simon Horman [Wed, 4 Jan 2017 08:37:26 +0000 (09:37 +0100)] 
MEDIUM: stats: Add show json schema

This may be used to output the JSON schema which describes the output of
show info json and show stats json.

The JSON output is without any extra whitespace in order to reduce the
volume of output. For human consumption passing the output through a
pretty printer may be helpful.

e.g.:
$ echo "show schema json" | socat /var/run/haproxy.stat stdio | \
     python -m json.tool

The implementation does not generate the schema. Some consideration could
be given to integrating the output of the schema with the output of
typed and json info and stats. In particular the types (u32, s64, etc...)
and tags.

A sample verification of show info json and show stats json using
the schema is as follows. It uses the jsonschema python module:

cat > jschema.py <<  __EOF__
import json

from jsonschema import validate
from jsonschema.validators import Draft3Validator

with open('schema.txt', 'r') as f:
    schema = json.load(f)
    Draft3Validator.check_schema(schema)

    with open('instance.txt', 'r') as f:
        instance = json.load(f)
validate(instance, schema, Draft3Validator)
__EOF__

$ echo "show schema json" | socat /var/run/haproxy.stat stdio > schema.txt
$ echo "show info json" | socat /var/run/haproxy.stat stdio > instance.txt
python ./jschema.py
$ echo "show stats json" | socat /var/run/haproxy.stat stdio > instance.txt
python ./jschema.py

Signed-off-by: Simon Horman <horms@verge.net.au>
8 years agoMEDIUM: stats: Add JSON output option to show (info|stat)
Simon Horman [Wed, 4 Jan 2017 08:37:25 +0000 (09:37 +0100)] 
MEDIUM: stats: Add JSON output option to show (info|stat)

Add a json parameter to show (info|stat) which will output information
in JSON format. A follow-up patch will add a JSON schema which describes
the format of the JSON output of these commands.

The JSON output is without any extra whitespace in order to reduce the
volume of output. For human consumption passing the output through a
pretty printer may be helpful.

e.g.:
$ echo "show info json" | socat /var/run/haproxy.stat stdio | \
     python -m json.tool

STAT_STARTED has bee added in order to track if show output has begun or
not. This is used in order to allow the JSON output routines to only insert
a "," between elements when needed. I would value any feedback on how this
might be done better.

Signed-off-by: Simon Horman <horms@verge.net.au>
8 years agoCLEANUP: http: make http_server_error() not set the status anymore
Willy Tarreau [Tue, 14 Mar 2017 10:07:31 +0000 (11:07 +0100)] 
CLEANUP: http: make http_server_error() not set the status anymore

Given that all call places except one had to set txn->status prior to
calling http_server_error(), it's simpler to make this function rely
on txn->status than have it store it from an argument.

8 years agoMINOR: http-request tarpit deny_status.
Jarno Huuskonen [Mon, 6 Mar 2017 12:56:36 +0000 (14:56 +0200)] 
MINOR: http-request tarpit deny_status.

Implements deny_status for http-request tarpit rule (allows setting
custom http status code). This commit depends on:
MEDIUM: http_error_message: txn->status / http_get_status_idx.

8 years agoMEDIUM: http_error_message: txn->status / http_get_status_idx.
Jarno Huuskonen [Mon, 6 Mar 2017 12:21:49 +0000 (14:21 +0200)] 
MEDIUM: http_error_message: txn->status / http_get_status_idx.

This commit removes second argument(msgnum) from http_error_message and
changes http_error_message to use s->txn->status/http_get_status_idx for
mapping status code from 200..504 to HTTP_ERR_200..HTTP_ERR_504(enum).

This is needed for http-request tarpit deny_status commit.

8 years agoCLEANUP: Remove comment that's no longer valid
Nenad Merdanovic [Sun, 12 Mar 2017 21:00:29 +0000 (22:00 +0100)] 
CLEANUP: Remove comment that's no longer valid

Code was deleted in ad63582eb, but the comment remained.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoMINOR: Add hostname sample fetch
Nenad Merdanovic [Sun, 12 Mar 2017 21:00:00 +0000 (22:00 +0100)] 
MINOR: Add hostname sample fetch

It adds "hostname" as a new sample fetch. It does exactly the same as
"%H" in a log format except that it can be used outside of log formats.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoCLEANUP: Replace repeated code to count usable servers with be_usable_srv()
Nenad Merdanovic [Sun, 12 Mar 2017 20:56:56 +0000 (21:56 +0100)] 
CLEANUP: Replace repeated code to count usable servers with be_usable_srv()

2 places were using an open-coded implementation of this function to count
available servers. Note that the avg_queue_size() fetch didn't check that
the proxy was in STOPPED state so it would possibly return a wrong server
count here but that wouldn't impact the returned value.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoMINOR: Add nbsrv sample converter
Nenad Merdanovic [Sun, 12 Mar 2017 20:56:55 +0000 (21:56 +0100)] 
MINOR: Add nbsrv sample converter

This is like the nbsrv() sample fetch function except that it works as
a converter so it can count the number of available servers of a backend
name retrieved using a sample fetch or an environment variable.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoBUG/MINOR: Fix "get map <map> <value>" CLI command
Nenad Merdanovic [Sun, 12 Mar 2017 21:01:36 +0000 (22:01 +0100)] 
BUG/MINOR: Fix "get map <map> <value>" CLI command

The said form of the CLI command didn't return anything since commit
ad8be61c7.

This fix needs to be backported to 1.7.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoBUG/MEDIUM: cli: Prevent double free in CLI ACL lookup
Nenad Merdanovic [Sun, 12 Mar 2017 21:01:35 +0000 (22:01 +0100)] 
BUG/MEDIUM: cli: Prevent double free in CLI ACL lookup

The memory is released by cli_release_mlook, which also properly sets the
pointer to NULL. This was introduced with a big code reorganization
involving moving to the new keyword registration form in commit ad8be61c7.

This fix needs to be backported to 1.7.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
8 years agoBUG/MEDIUM: ssl: Clear OpenSSL error stack after trying to parse OCSP file
Janusz Dziemidowicz [Wed, 8 Mar 2017 15:59:41 +0000 (16:59 +0100)] 
BUG/MEDIUM: ssl: Clear OpenSSL error stack after trying to parse OCSP file

Invalid OCSP file (for example empty one that can be used to enable
OCSP response to be set dynamically later) causes errors that are
placed on OpenSSL error stack. Those errors are not cleared so
anything that checks this stack later will fail.

Following configuration:
  bind :443 ssl crt crt1.pem crt crt2.pem

With following files:
  crt1.pem
  crt1.pem.ocsp - empty one
  crt2.pem.rsa
  crt2.pem.ecdsa

Will fail to load.

This patch should be backported to 1.7.

8 years agoMINOR: config: warn when some HTTP rules are used in a TCP proxy
Willy Tarreau [Fri, 10 Mar 2017 10:49:21 +0000 (11:49 +0100)] 
MINOR: config: warn when some HTTP rules are used in a TCP proxy

Surprizingly, http-request, http-response, block, redirect, and capture
rules did not cause a warning to be emitted when used in a TCP proxy, so
let's fix this.

This patch may be backported to older versions as it helps spotting
configuration issues.

8 years agoDOC: spoe: Update SPOE documentation to reflect recent changes
Christopher Faulet [Mon, 27 Feb 2017 20:59:39 +0000 (21:59 +0100)] 
DOC: spoe: Update SPOE documentation to reflect recent changes

8 years agoMINOR: spoe: Add "max-frame-size" statement in spoe-agent section
Christopher Faulet [Mon, 27 Feb 2017 08:40:34 +0000 (09:40 +0100)] 
MINOR: spoe: Add "max-frame-size" statement in spoe-agent section

As its named said, this statement customize the maximum allowed size for frames
exchanged between HAProxy and SPOAs. It should be greater than or equal to 256
and less than or equal to (tune.bufsize - 4) (4 bytes are reserved to the frame
length).

8 years agoMINOR: spoe: Add "send-frag-payload" option in spoe-agent section
Christopher Faulet [Fri, 24 Feb 2017 21:11:21 +0000 (22:11 +0100)] 
MINOR: spoe: Add "send-frag-payload" option in spoe-agent section

This option can be used to enable or to disable (prefixing the option line with
the "no" keyword) the sending of fragmented payload to agents. By default, this
option is enabled.

8 years agoMINOR: spoe: Rely on alertif_too_many_arg during configuration parsing
Christopher Faulet [Thu, 23 Feb 2017 21:52:39 +0000 (22:52 +0100)] 
MINOR: spoe: Rely on alertif_too_many_arg during configuration parsing

8 years agoMINOR: spoe: Add "pipelining" and "async" options in spoe-agent section
Christopher Faulet [Thu, 23 Feb 2017 15:17:53 +0000 (16:17 +0100)] 
MINOR: spoe: Add "pipelining" and "async" options in spoe-agent section

These options can be used to enable or to disable (prefixing the option line
with the "no" keyword), respectively, pipelined and asynchronous exchanged
between HAproxy and agents. By default, pipelining and async options are
enabled.

8 years agoMINOR: spoe: Add support of negation for options in SPOE configuration file
Christopher Faulet [Thu, 23 Feb 2017 14:06:26 +0000 (15:06 +0100)] 
MINOR: spoe: Add support of negation for options in SPOE configuration file

For now, no options support negation (using "no" keyword). So it always returns
an error.

8 years agoMINOR: spoe: Improve implementation of the payload fragmentation
Christopher Faulet [Fri, 17 Feb 2017 14:18:35 +0000 (15:18 +0100)] 
MINOR: spoe: Improve implementation of the payload fragmentation

Now, when a payload is fragmented, the first frame must define the frame type
and the followings must use the special type SPOE_FRM_T_UNSET. This way, it is
easy to know if a fragment is the first one or not. Of course, all frames must
still share the same stream-id and frame-id.

Update SPOA example accordingly.

8 years agoREORG: spoe: Move low-level encoding/decoding functions in dedicated header file
Christopher Faulet [Fri, 24 Feb 2017 13:31:11 +0000 (14:31 +0100)] 
REORG: spoe: Move low-level encoding/decoding functions in dedicated header file

So, it will be easier to anyone to develop external services using these
functions.

SPOA example has been updated accordingly.

8 years agoREORG: spoe: Move struct and enum definitions in dedicated header file
Christopher Faulet [Fri, 17 Feb 2017 08:32:19 +0000 (09:32 +0100)] 
REORG: spoe: Move struct and enum definitions in dedicated header file

SPOA example has been Updated accordingly

8 years agoMINOR: spoe: Handle NOTIFY frames cancellation using ABORT bit in ACK frames
Christopher Faulet [Thu, 9 Feb 2017 08:44:33 +0000 (09:44 +0100)] 
MINOR: spoe: Handle NOTIFY frames cancellation using ABORT bit in ACK frames

If an agent want to abort the processing a fragmented NOTIFY frame before
receiving all fragments, it can send an ACK frame at any time with ABORT bit set
(and of course, the FIN bit too).

Beside this change, SPOE_FRM_ERR_FRAMEID_NOTFOUND error flag has been added. It
is set when a unknown ACK frame is received.

8 years agoMAJOR: spoe: refactor the filter to clean up the code
Christopher Faulet [Mon, 20 Feb 2017 21:56:03 +0000 (22:56 +0100)] 
MAJOR: spoe: refactor the filter to clean up the code

The SPOE code is now pretty big and it was the good time to clean it up. It is
not perfect, some parts remains a bit ugly. But it is far better now.

8 years agoMINOR: spoe: Add support for fragmentation capability in the SPOA example
Christopher Faulet [Thu, 2 Feb 2017 09:14:36 +0000 (10:14 +0100)] 
MINOR: spoe: Add support for fragmentation capability in the SPOA example

This is just an example. So be careful to not send really huge payload because
it would eat all your memory.

8 years agoMAJOR: spoe: Add support of payload fragmentation in NOTIFY frames
Christopher Faulet [Thu, 19 Jan 2017 09:01:12 +0000 (10:01 +0100)] 
MAJOR: spoe: Add support of payload fragmentation in NOTIFY frames

Now, agents can announce the support for the "fragmentation" capability during
the HELLO handshake. HAProxy will never announce it because fragmented frame
decoding is not implemented yet. But it can send such kind of frames. So, if an
agent supports this capability, payloads exceeding the frame size will be
split. A fragemented payload consists of several frames with the FIN bit clear
and terminated by a single frame with the FIN bit set. All these frames must
share the same STREAM-ID and FRAME-ID.

Note that an unfragemnted payload consists of a single frame with the FIN bit
set. And HELLO and DISCONNECT frames cannot be fragmented. This means that only
NOTIFY frames can transport fragmented payload for now.

8 years agoMINOR: spoe: Use the min of all known max_frame_size to encode messages
Christopher Faulet [Fri, 13 Jan 2017 10:30:50 +0000 (11:30 +0100)] 
MINOR: spoe: Use the min of all known max_frame_size to encode messages

The max_frame_size value is negociated between HAProxy and SPOE agents during
the HELLO handshake. It is a per-connection value. Different SPOE agents can
choose to use different max_frame_size values. So, now, we keep the minimum of
all known max_frame_size. This minimum is updated when a new connection to a
SPOE agent is opened and when a connection is closed. We use this value as a
limit to encode messages in NOTIFY frames.

8 years agoMEDIUM: spoe: Be sure to wakeup the good entity waiting for a buffer
Christopher Faulet [Wed, 11 Jan 2017 13:05:19 +0000 (14:05 +0100)] 
MEDIUM: spoe: Be sure to wakeup the good entity waiting for a buffer

This happens when buffer allocation failed. In the SPOE context, buffers are
allocated by streams and SPOE applets at different time. First, by streams, when
messages need to be encoded before sending them in a NOTIFY frame. Then, by SPOE
applets, when a ACK frame is received.

The first case works as expected, we wake up the stream. But for the second one,
we must wake up the waiting SPOE applet.

8 years agoMINOR: spoe: Check the scope of sample fetches used in SPOE messages
Christopher Faulet [Mon, 9 Jan 2017 15:56:23 +0000 (16:56 +0100)] 
MINOR: spoe: Check the scope of sample fetches used in SPOE messages

If an error is triggered, the corresponding message is ignored and a warning is
emitted.

8 years agoMINOR: spoe: Send a log message when an error occurred during event processing
Christopher Faulet [Wed, 4 Jan 2017 15:39:41 +0000 (16:39 +0100)] 
MINOR: spoe: Send a log message when an error occurred during event processing

8 years agoMINOR: spoe: Add status code in error variable instead of hardcoded value
Christopher Faulet [Wed, 4 Jan 2017 15:39:11 +0000 (16:39 +0100)] 
MINOR: spoe: Add status code in error variable instead of hardcoded value

Now, when option "set-on-error" is enabled, we set a status code representing
the error occurred instead of "true". For values under 256, it represents an
error coming from the engine. Below 256, it reports a SPOP error. In this case,
to retrieve the right SPOP status code, you must remove 256 to this value. Here
are possible values:

  * 1:     a timeout occurred during the event processing.
  * 2:     an error was triggered during the ressources allocation.
  * 255:   an unknown error occurred during the event processing.
  * 256+N: a SPOP error occurred during the event processing.

8 years agoMINOR: spoe: Remove SPOE details from the appctx structure
Christopher Faulet [Wed, 4 Jan 2017 13:14:19 +0000 (14:14 +0100)] 
MINOR: spoe: Remove SPOE details from the appctx structure

Now, as for peers, we use an opaque pointer to store information related to the
SPOE filter in appctx structure. These information are now stored in a dedicated
structure (spoe_appctx) and allocated, using a pool, when the applet is created.

This removes the dependency between applets and the SPOE filter and avoids to
eventually inflate the appctx structure.

8 years agoMINOR: spoe: Add support for pipelining/async capabilities in the SPOA example
Christopher Faulet [Wed, 21 Dec 2016 07:58:16 +0000 (08:58 +0100)] 
MINOR: spoe: Add support for pipelining/async capabilities in the SPOA example

Now, we can use the option '-c' to enable the support of a capability. By
default, all capabilities are disabled. For example:

  $> ./spoa -c async -c pipelining

In addition, it is also possible to set the maximum frame size supported by your
agent (-m) and to add a delay in frames processing (-t).

8 years agoMAJOR: spoe: Add support of pipelined and asynchronous exchanges with agents
Christopher Faulet [Wed, 21 Dec 2016 07:58:06 +0000 (08:58 +0100)] 
MAJOR: spoe: Add support of pipelined and asynchronous exchanges with agents

Now, HAProxy and agents can announce the support for "pipelining" and/or "async"
capabilities during the HELLO handshake. For now, HAProxy always announces the
support of both. In addition, in its HELLO frames. HAproxy adds the "engine-id"
key. It is a uniq string that identify a SPOE engine.

The "pipelining" capability is the ability for a peer to decouple NOTIFY and ACK
frames. This is a symmectical capability. To be used, it must be supported by
HAproxy and agents. Unlike HTTP pipelining, the ACK frames can be send in any
order, but always on the same TCP connection used for the corresponding NOTIFY
frame.

The "async" capability is similar to the pipelining, but here any TCP connection
established between HAProxy and the agent can be used to send ACK frames. if an
agent accepts connections from multiple HAProxy, it can use the "engine-id"
value to group TCP connections.

8 years agoBUG/MINOR: spoe: Fix parsing of arguments in spoe-message section
Christopher Faulet [Thu, 23 Feb 2017 21:41:09 +0000 (22:41 +0100)] 
BUG/MINOR: spoe: Fix parsing of arguments in spoe-message section

The array of pointers passed to sample_parse_expr was not really an array but a
pointer to pointer. So it can easily lead to a segfault during the configuration
parsing.

8 years agoBUG/MINOR: spoe: Fix soft stop handler using a specific id for spoe filters
Christopher Faulet [Thu, 23 Feb 2017 09:17:15 +0000 (10:17 +0100)] 
BUG/MINOR: spoe: Fix soft stop handler using a specific id for spoe filters

During a soft stop, we need to wakeup all SPOE applets to stop them. So we loop
on all proxies, and for each proxy, on all filters. But we must be sure to only
handle SPOE filters here. To do so, we use a specific id.

8 years agoMINOR: ssl: improved cipherlist captures
Emmanuel Hocdet [Wed, 8 Mar 2017 10:07:10 +0000 (11:07 +0100)] 
MINOR: ssl: improved cipherlist captures

Alloc capture buffer later (when filling), parse client-hello after
heartbeat check and remove capture->conn (unused).

8 years agoBUG/MINOR: ssl: fix cipherlist captures with sustainable SSL calls
Emmanuel Hocdet [Tue, 7 Mar 2017 17:34:58 +0000 (18:34 +0100)] 
BUG/MINOR: ssl: fix cipherlist captures with sustainable SSL calls

Use SSL_set_ex_data/SSL_get_ex_data standard API call to store capture.
We need to avoid internal structures/undocumented calls usage to try to
control the beast and limit painful compatibilities.

8 years agoBUG/MEDIUM: ssl: in bind line, ssl-options after 'crt' are ignored.
Emmanuel Hocdet [Mon, 6 Mar 2017 14:34:44 +0000 (15:34 +0100)] 
BUG/MEDIUM: ssl: in bind line, ssl-options after 'crt' are ignored.

Bug introduced with "removes SSL_CTX_set_ssl_version call and cleanup CTX
creation": ssl_sock_new_ctx is called before all the bind line is parsed.
The fix consists of separating the use of default_ctx as the initialization
context of the SSL connection via bind_conf->initial_ctx. Initial_ctx contains
all the necessary parameters before performing the selection of the CTX:
default_ctx is processed as others ctx without unnecessary parameters.

8 years agoMEDIUM: ssl: remove ssl-options from crt-list
Emmanuel Hocdet [Fri, 20 Jan 2017 12:06:27 +0000 (13:06 +0100)] 
MEDIUM: ssl: remove ssl-options from crt-list

ssl-options are link to the initial negotiation environnement worn
by default_ctx.
Remove it from crt-list to avoid any confusion.

8 years agoMEDIUM: ssl: add new sample-fetch which captures the cipherlist
Thierry FOURNIER [Sat, 25 Feb 2017 11:45:22 +0000 (12:45 +0100)] 
MEDIUM: ssl: add new sample-fetch which captures the cipherlist

This new sample-fetches captures the cipher list offer by the client
SSL connection during the client-hello phase. This is useful for
fingerprint the SSL connection.

8 years agoBUILD: ssl: fix build with -DOPENSSL_NO_DH
Emmanuel Hocdet [Fri, 3 Mar 2017 16:04:14 +0000 (17:04 +0100)] 
BUILD: ssl: fix build with -DOPENSSL_NO_DH

8 years agoMINOR: ssl: removes SSL_CTX_set_ssl_version call and cleanup CTX creation.
Emmanuel Hocdet [Fri, 3 Mar 2017 11:21:32 +0000 (12:21 +0100)] 
MINOR: ssl: removes SSL_CTX_set_ssl_version call and cleanup CTX creation.

BoringSSL doesn't support SSL_CTX_set_ssl_version. To remove this call, the
CTX creation is cleanup to clarify what is happening. SSL_CTX_new is used to
match the original behavior, in order: force-<method> according the method
version then the default method with no-<method> options.
OPENSSL_NO_SSL3 error message is now in force-sslv3 parsing (as force-tls*).
For CTX creation in bind environement, all CTX set related to the initial ctx
are aggregate to ssl_sock_new_ctx function for clarity.

Tests with crt-list have shown that server_method, options and mode are
linked to the initial CTX (default_ctx): all ssl-options are link to each
bind line and must be removed from crt-list.

8 years agoBUG/MEDIUM: ssl: switchctx should not return SSL_TLSEXT_ERR_ALERT_WARNING
Emmanuel Hocdet [Fri, 3 Mar 2017 14:21:26 +0000 (15:21 +0100)] 
BUG/MEDIUM: ssl: switchctx should not return SSL_TLSEXT_ERR_ALERT_WARNING

Extract from RFC 6066:
"If the server understood the ClientHello extension but does not recognize
the server name, the server SHOULD take one of two actions: either abort the
handshake by sending a fatal-level unrecognized_name(112) alert or continue the
handshake. It is NOT RECOMMENDED to send a warning-level unrecognized_name(112)
alert, because the client's behavior in response to warning-level alerts is
unpredictable. If there is a mismatch between the server name used by the
client application and the server name of the credential chosen by the server,
this mismatch will become apparent when the client application performs the
server endpoint identification, at which point the client application will have
to decide whether to proceed with the communication."

Thanks Roberto Guimaraes for the bug repport, spotted with openssl-1.1.0.
This fix must be backported.

8 years agoBUG/MEDIUM: ssl: fix verify/ca-file per certificate
Emmanuel Hocdet [Wed, 1 Mar 2017 17:54:56 +0000 (18:54 +0100)] 
BUG/MEDIUM: ssl: fix verify/ca-file per certificate

SSL verify and client_CA inherits from the initial ctx (default_ctx).
When a certificate is found, the SSL connection environment must be replaced by
the certificate configuration (via SSL_set_verify and SSL_set_client_CA_list).

8 years agoMEDIUM: boringssl: support native multi-cert selection without bundling
Emmanuel Hocdet [Mon, 20 Feb 2017 15:11:50 +0000 (16:11 +0100)] 
MEDIUM: boringssl: support native multi-cert selection without bundling

This patch used boringssl's callback to analyse CLientHello before any
handshake to extract key signature capabilities.
Certificat with better signature (ECDSA before RSA) is choosed
transparenty, if client can support it. RSA and ECDSA certificates can
be declare in a row (without order). This makes it possible to set
different ssl and filter parameter with crt-list.

8 years agoMINOR: http: don't close when redirect location doesn't start with "/"
Willy Tarreau [Tue, 28 Feb 2017 08:48:11 +0000 (09:48 +0100)] 
MINOR: http: don't close when redirect location doesn't start with "/"

In 1.4-dev5 when we started to implement keep-alive, commit a9679ac
("[MINOR] http: make the conditional redirect support keep-alive")
added a specific check was added to support keep-alive on redirect
rules but only when the location would start with a "/" indicating
the client would come back to the same server.

But nowadays most applications put http:// or https:// in front of
each and every location, and continuing to perform a close there is
counter-efficient, especially when multiple objects are fetched at
once from a same origin which redirects them to the correct origin
(eg: after an http to https forced upgrade).

It's about time to get rid of this old trick as it causes more harm
than good at an era where persistent connections are omnipresent.

Special thanks to Ciprian Dorin Craciun for providing convincing
arguments with a pretty valid use case and proposing this draft
patch which addresses the issue he was facing.

This change although not exactly a bug fix should be backported
to 1.7 to adapt better to existing infrastructure.

8 years agoBUG/MEDIUM: config: reject anything but "if" or "unless" after a use-backend rule
Willy Tarreau [Tue, 28 Feb 2017 08:34:39 +0000 (09:34 +0100)] 
BUG/MEDIUM: config: reject anything but "if" or "unless" after a use-backend rule

Adrian Fitzpatrick reported that since commit f51658d ("MEDIUM: config:
relax use_backend check to make the condition optional"), typos like "of"
instead of "if" on use_backend rules are not properly detected. The reason
is that the parser only checks for "if" or "unless" otherwise it considers
there's no keyword, making the rule inconditional.

This patch fixes it. It may reveal some rare config bugs for some people,
but will not affect valid configurations.

This fix must be backported to 1.7, 1.6 and 1.5.

8 years agoBUG/MAJOR: lua segmentation fault when the request is like 'GET ?arg=val HTTP/1.1'
Thierry FOURNIER [Wed, 22 Feb 2017 01:06:16 +0000 (02:06 +0100)] 
BUG/MAJOR: lua segmentation fault when the request is like 'GET ?arg=val HTTP/1.1'

Error in the HTTP parser. The function http_get_path() can
return NULL and this case is not catched in the code. So, we
try to dereference NULL pointer, and a segfault occurs.

These two lines are useful to prevent the bug.

   acl prevent_bug path_beg /
http-request deny if !prevent_bug

This bug fix should be backported in 1.6 and 1.7

8 years agoBUG/MAJOR: ssl: fix a regression in ssl_sock_shutw()
Willy Tarreau [Mon, 13 Feb 2017 10:12:29 +0000 (11:12 +0100)] 
BUG/MAJOR: ssl: fix a regression in ssl_sock_shutw()

Commit 405ff31 ("BUG/MINOR: ssl: assert on SSL_set_shutdown with BoringSSL")
introduced a regression causing some random crashes apparently due to
memory corruption. The issue is the use of SSL_CTX_set_quiet_shutdown()
instead of SSL_set_quiet_shutdown(), making it use a different structure
and causing the flag to be put who-knows-where.

Many thanks to Jarno Huuskonen who reported this bug early and who
bisected the issue to spot this patch. No backport is needed, this
is 1.8-specific.

8 years agoBUG/MINOR: sendmail: The return of vsnprintf is not cleanly tested
Thierry FOURNIER [Thu, 9 Feb 2017 11:19:27 +0000 (12:19 +0100)] 
BUG/MINOR: sendmail: The return of vsnprintf is not cleanly tested

The string formatted by vsnprintf may be bigger than the size of
the buffer "buf". This case is not tested.

This sould be backported to 1.6 and 1.7

8 years agoBUG/MINOR: http: Return an error when a replace-header rule failed on the response
Christopher Faulet [Wed, 8 Feb 2017 11:41:31 +0000 (12:41 +0100)] 
BUG/MINOR: http: Return an error when a replace-header rule failed on the response

Historically, http-response rules couldn't produce errors generating HTTP
responses during their evaluation. This possibility was "implicitly" added with
http-response redirect rules (51d861a4). But, at the time, replace-header rules
were kept untouched. When such a rule failed, the rules processing was just
stopped (like for an accept rule).

Conversely, when a replace-header rule fails on the request, it generates a HTTP
response (400 Bad Request).

With this patch, errors on replace-header rule are now handled in the same way
for HTTP requests and HTTP responses.

This patch should be backported in 1.7 and 1.6.

8 years agoBUG/MEDIUM: http: Prevent replace-header from overwriting a buffer
Christopher Faulet [Wed, 8 Feb 2017 11:17:07 +0000 (12:17 +0100)] 
BUG/MEDIUM: http: Prevent replace-header from overwriting a buffer

This is the same fix as which concerning the redirect rules (0d94576c).

The buffer used to expand the <replace-fmt> argument must be protected to
prevent it being overwritten during build_logline() execution (the function used
to expand the format string).

This patch should be backported in 1.7, 1.6 and 1.5. It relies on commit b686afd
("MINOR: chunks: implement a simple dynamic allocator for trash buffers") for
the trash allocator, which has to be backported as well.

8 years agoBUG/MEDIUM: filters: Do not truncate HTTP response when body length is undefined
Christopher Faulet [Wed, 8 Feb 2017 08:45:13 +0000 (09:45 +0100)] 
BUG/MEDIUM: filters: Do not truncate HTTP response when body length is undefined

Some users have experienced some troubles using the compression filter when the
HTTP response body length is undefined. They complained about receiving
truncated responses.

In fact, the bug can be triggered if there is at least one filter attached to
the stream but none registered to analyze the HTTP response body. In this case,
when the body length is undefined, data should be forwarded without any
parsing. But, because of a wrong check, we were starting to parse them. Because
it was not expected, the end of response was not correctly detected and the
response could be truncted. So now, we rely on HAS_DATA_FILTER macro instead of
HAS_FILTER one to choose to parse HTTP response body or not.

Furthermore, in http_response_forward_body, the test to not forward the server
closure to the client has been updated to reflect conditions listed in the
associated comment.

And finally, in http_msg_forward_body, when the body length is undefined, we
continue the parsing it until the server closes the connection without any on
filters. So filters can safely stop to filter data during their parsing.

This fix should be backported in 1.7

8 years agoBUG/MEDIUM: http: prevent redirect from overwriting a buffer
Thierry FOURNIER [Sat, 28 Jan 2017 06:39:53 +0000 (07:39 +0100)] 
BUG/MEDIUM: http: prevent redirect from overwriting a buffer

See 4b788f7d349ddde3f70f063b7394529eac6ab678

If we use the action "http-request redirect" with a Lua sample-fetch or
converter, and the Lua function calls one of the Lua log function, the
header name is corrupted, it contains an extract of the last loggued data.

This is due to an overwrite of the trash buffer, because his scope is not
respected in the "add-header" function. The scope of the trash buffer must
be limited to the function using it. The build_logline() function can
execute a lot of other function which can use the trash buffer.

This patch fix the usage of the trash buffer. It limits the scope of this
global buffer to the local function, we build first the header value using
build_logline, and after we store the header name.

Thanks Jesse Schulman for the bug repport.

This patch must be backported in 1.7, 1.6 and 1.5 version, and it relies
on commit b686afd ("MINOR: chunks: implement a simple dynamic allocator for
trash buffers") for the trash allocator, which has to be backported as well.

8 years agoMINOR: chunks: implement a simple dynamic allocator for trash buffers
Willy Tarreau [Wed, 8 Feb 2017 10:06:11 +0000 (11:06 +0100)] 
MINOR: chunks: implement a simple dynamic allocator for trash buffers

The trash buffers are becoming increasingly complex to deal with due to
the code's modularity allowing some functions to be chained and causing
the same chunk buffers to be used multiple times along the chain, possibly
corrupting each other. In fact the trash were designed from scratch for
explicitly not surviving a function call but string manipulation makes
this impossible most of the time while not fullfilling the need for
reliable temporary chunks.

Here we introduce the ability to allocate a temporary trash chunk which
is reserved, so that it will not conflict with the trash chunks other
functions use, and will even support reentrant calls (eg: build_logline).

For this, we create a new pool which is exactly the size of a usual chunk
buffer plus the size of the chunk struct so that these chunks when allocated
are exactly the same size as the ones returned by get_trash_buffer(). These
chunks may fail so the caller must check them, and the caller is also
responsible for freeing them.

The code focuses on minimal changes and ease of reliable backporting
because it will be needed in stable versions in order to support next
patch.

8 years agoBUG/MAJOR: dns: restart sockets after fork()
Baptiste Assmann [Thu, 2 Feb 2017 22:14:51 +0000 (23:14 +0100)] 
BUG/MAJOR: dns: restart sockets after fork()

UDP sockets used to send DNS queries are created before fork happens and
this is a big problem because all the processes (in case of a
configuration starting multiple processes) share the same socket. Some
processes may consume responses dedicated to an other one, some servers
may be disabled, some IPs changed, etc...

As a workaround, this patch close the existing socket and create a new
one after the fork() has happened.

[wt: backport this to 1.7]

8 years agoMINOR: dns: give ability to dns_init_resolvers() to close a socket when requested
Baptiste Assmann [Thu, 2 Feb 2017 21:44:15 +0000 (22:44 +0100)] 
MINOR: dns: give ability to dns_init_resolvers() to close a socket when requested

The function dns_init_resolvers() is used to initialize socket used to
send DNS queries.
This patch gives the function the ability to close a socket before
re-opening it.

[wt: this needs to be backported to 1.7 for next fix]

8 years agoBUG/MINOR: lua: Map.end are not reliable because "end" is a reserved keyword
Thierry FOURNIER [Sat, 28 Jan 2017 07:33:08 +0000 (08:33 +0100)] 
BUG/MINOR: lua: Map.end are not reliable because "end" is a reserved keyword

This patch change the names prefixing it by a "_". So "end" becomes "_end".
The backward compatibility with names without the prefix "_" is assured.
In other way, another the keyword "end" can be used like this: Map['end'].

Thanks Robin H. Johnson for the bug repport

This should be backported in version 1.6 and 1.7

8 years agoMINOR: server: extend the flags to 32 bits
Willy Tarreau [Mon, 23 Jan 2017 20:38:57 +0000 (21:38 +0100)] 
MINOR: server: extend the flags to 32 bits

Right now not only we're limited to 8 bits, but it's mentionned nowhere
and the limit was already reached. In addition, pp_opts (proxy protocol
options) were set to 32 bits while only 3 are needed. So let's swap
these two and group them together to avoid leaving two holes in the
structure, saving 64 bits on 64-bit machines.

8 years agoBUG/MINOR: unix: fix connect's polling in case no data are scheduled
Willy Tarreau [Wed, 25 Jan 2017 13:27:38 +0000 (14:27 +0100)] 
BUG/MINOR: unix: fix connect's polling in case no data are scheduled

There's a test after a successful synchronous connect() consisting
in waking the data layer up asap if there's no more handshake.
Unfortunately this test is run before setting the CO_FL_SEND_PROXY
flag and before the transport layer adds its own flags, so it can
indicate a willingness to send data while it's not the case and it
will have to be handled later.

This has no visible effect except a useless call to a function in
case of health checks making use of the proxy protocol for example.

Additionally a corner case where EALREADY was returned and considered
equivalent to EISCONN was fixed so that it's considered equivalent to
EINPROGRESS given that the connection is not complete yet. But this
code should never return on the first call anyway so it's mostly a
cleanup.

This fix should be backported to 1.7 and 1.6 at least to avoid
headaches during some debugging.

8 years agoBUG/MEDIUM: tcp: don't poll for write when connect() succeeds
Willy Tarreau [Wed, 25 Jan 2017 13:12:22 +0000 (14:12 +0100)] 
BUG/MEDIUM: tcp: don't poll for write when connect() succeeds

While testing a tcp_fastopen related change, it appeared that in the rare
case where connect() can immediately succeed, we still subscribe to write
notifications on the socket, causing the conn_fd_handler() to immediately
be called and a second call to connect() to be attempted to double-check
the connection.

In fact this issue had already been met with unix sockets (which often
respond immediately) and partially addressed but incorrect so another
patch will follow. But for TCP nothing was done.

The fix consists in removing the WAIT_L4_CONN flag if connect() succeeds
and to subscribe for writes only if some handshakes or L4_CONN are still
needed. In addition in order not to fail raw TCP health checks, we have
to continue to enable polling for data when nothing is scheduled for
leaving and the connection is already established, otherwise the caller
will never be notified.

This fix should be backported to 1.7 and 1.6.

8 years agoBUILD: ssl: kill a build warning introduced by BoringSSL compatibility
Willy Tarreau [Thu, 19 Jan 2017 16:25:20 +0000 (17:25 +0100)] 
BUILD: ssl: kill a build warning introduced by BoringSSL compatibility

A recent patch to support BoringSSL caused this warning to appear on
OpenSSL 1.1.0 :
   src/ssl_sock.c:3062:4: warning: statement with no effect [-Wunused-value]

It's caused by SSL_CTX_set_ecdh_auto() which is now only a macro testing
that the last argument is zero, and the result is not used here. Let's
just kill it for both versions.

Tested with 0.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0. This fix may be backported
to 1.7 if the boringssl fix is as well.

8 years agoBUILD: ssl: eliminate warning with OpenSSL 1.1.0 regarding RAND_pseudo_bytes()
Willy Tarreau [Thu, 19 Jan 2017 16:10:54 +0000 (17:10 +0100)] 
BUILD: ssl: eliminate warning with OpenSSL 1.1.0 regarding RAND_pseudo_bytes()

This function was deprecated in 1.1.0 causing this warning :

  src/ssl_sock.c:551:3: warning: 'RAND_pseudo_bytes' is deprecated (declared at /opt/openssl-1.1.0/include/openssl/rand.h:47) [-Wdeprecated-declarations]

The man suggests to use RAND_bytes() instead. While the return codes
differ, it turns out that the function was already misused and was
relying on RAND_bytes() return code instead.

The patch was tested on 0.9.8, 1.0.0, 1.0.1, 1.0.2 and 1.1.0.

This fix must be backported to 1.7 and the return code check should
be backported to earlier versions if relevant.

8 years agoBUILD: ssl: silence a warning reported for ERR_remove_state()
Willy Tarreau [Thu, 19 Jan 2017 15:50:25 +0000 (16:50 +0100)] 
BUILD: ssl: silence a warning reported for ERR_remove_state()

In 1.0.0, this function was replaced with ERR_remove_thread_state().
As of openssl 1.1.0, both are now deprecated and do nothing at all.
Thus we simply make this call do nothing in 1.1.0 to silence the
warning.

The change was tested with 0.9.8, 1.0.0, 1.0.1, 1.0.2 and 1.1.0.

This kills the following warning on 1.1.0 :
   src/ssl_sock.c:7266:9: warning: 'ERR_remove_state' is deprecated (declared at /dev/shm/openssl-1.1.0b/include/openssl/err.h:247) [-Wdeprecated-declarations]

This fix should be backported to 1.7.

8 years agoBUILD: ssl: fix build on OpenSSL 1.0.0
Willy Tarreau [Thu, 19 Jan 2017 16:04:02 +0000 (17:04 +0100)] 
BUILD: ssl: fix build on OpenSSL 1.0.0

After the code was ported to support 1.1.0, this one broke on 1.0.0 :

  src/shctx.c:406: undefined reference to `SSL_SESSION_set1_id_context'

The function was indeed introduced only in 1.0.1. The build was validated
with 0.9.8, 1.0.0, 1.0.1, 1.0.2 and 1.1.0.

This fix must be backported to 1.7.

8 years agoBUILD: ssl: fix to build (again) with boringssl
Emmanuel Hocdet [Fri, 13 Jan 2017 16:48:18 +0000 (17:48 +0100)] 
BUILD: ssl: fix to build (again) with boringssl

Limitations:
. disable force-ssl/tls (need more work)
should be set earlier with SSL_CTX_new (SSL_CTX_set_ssl_version is removed)
. disable generate-certificates (need more work)
introduce SSL_NO_GENERATE_CERTIFICATES to disable generate-certificates.

Cleanup some #ifdef and type related to boringssl env.

8 years agoMINOR: doc: Add docs for agent-addr and agent-send CLI commands
Misiek [Mon, 9 Jan 2017 08:53:06 +0000 (09:53 +0100)] 
MINOR: doc: Add docs for agent-addr and agent-send CLI commands

8 years agoMINOR: doc: Add docs for agent-addr configuration variable
Misiek [Mon, 9 Jan 2017 08:52:43 +0000 (09:52 +0100)] 
MINOR: doc: Add docs for agent-addr configuration variable

8 years agoMINOR: cli: Add possiblity to change agent config via CLI/socket
Misiek [Mon, 9 Jan 2017 08:40:42 +0000 (09:40 +0100)] 
MINOR: cli: Add possiblity to change agent config via CLI/socket

This change adds possibility to change agent-addr and agent-send directives
by CLI/socket. Now you can replace server's and their configuration without
reloading/restarting whole haproxy, so it's a step in no-reload/no-restart
direction.

Depends on #e9602af - agent-addr is implemented there.

Can be backported to 1.7.

8 years agoMINOR: checks: Add agent-addr config directive
Misiek [Mon, 9 Jan 2017 08:39:51 +0000 (09:39 +0100)] 
MINOR: checks: Add agent-addr config directive

This directive add possibility to set different address for agent-checks.
With this you can manage server status and weight from central place.

Can be backported to 1.7.

8 years agoMINOR: ssl: add curve suite for ECDHE negotiation
Emmanuel Hocdet [Mon, 9 Jan 2017 15:15:54 +0000 (16:15 +0100)] 
MINOR: ssl: add curve suite for ECDHE negotiation

Add 'curves' parameter on 'bind' and for 'crt-list' to set curve suite.
(ex: curves X25519:P-256)

8 years agoMAJOR: ssl: bind configuration per certificat
Emmanuel Hocdet [Thu, 29 Dec 2016 17:26:15 +0000 (18:26 +0100)] 
MAJOR: ssl: bind configuration per certificat

crt-list is extend to support ssl configuration. You can now have
such line in crt-list <file>:
mycert.pem [npn h2,http/1.1]

Support include "npn", "alpn", "verify", "ca_file", "crl_file",
"ecdhe", "ciphers" configuration and ssl options.

"crt-base" is also supported to fetch certificates.

8 years agoBUG/MINOR: stream: Fix how backend-specific analyzers are set on a stream
Christopher Faulet [Mon, 9 Jan 2017 15:33:19 +0000 (16:33 +0100)] 
BUG/MINOR: stream: Fix how backend-specific analyzers are set on a stream

When the stream's backend was defined, the request's analyzers flag was always
set to 0 if the stream had no listener. This bug was introduced with the filter
API but never triggered (I think so).

Because of the commit 5820a366, it is now possible to encountered it. For
example, this happens when the trace filter is enabled on a SPOE backend. The
fix is pretty trivial.

This fix must be backported to 1.7.

8 years agoOPTIM/MINOR: config: Optimize fullconn automatic computation loading configuration
Emeric Brun [Thu, 12 Jan 2017 10:21:28 +0000 (11:21 +0100)] 
OPTIM/MINOR: config: Optimize fullconn automatic computation loading configuration

The previous version used an O(number of proxies)^2 algo to get the sum of
the number of maxconns of frontends which reference a backend at least once.

This new version adds the frontend's maxconn number to the backend's
struct proxy member 'tot_fe_maxconn' when the backend name is resolved
for switching rules or default_backend statment.  At the end, the final
backend's fullconn is computed looping only one time for all on proxies O(n).

The load of a configuration using a large amount of backends (10 thousands)
without configured fullconn was reduced from several minutes to few seconds.

8 years agoMINOR: ssl: don't show prefer-server-ciphers output
Lukas Tribus [Wed, 11 Jan 2017 22:47:18 +0000 (22:47 +0000)] 
MINOR: ssl: don't show prefer-server-ciphers output

The output of whether prefer-server-ciphers is supported by OpenSSL
actually always show yes in 1.8, because SSL_OP_CIPHER_SERVER_PREFERENCE
is redefined before the actual check in src/ssl_sock.c, since it was
moved from here from src/haproxy.c.

Since this is not really relevant anymore as we don't support OpenSSL
< 0.9.7 anyway, this change just removes this output.

8 years agoBUG/MINOR: Reset errno variable before calling strtol(3)
Ryabin Sergey [Wed, 11 Jan 2017 15:39:55 +0000 (19:39 +0400)] 
BUG/MINOR: Reset errno variable before calling strtol(3)

Sometimes errno != 0 before calling strtol(3)

[wt: this needs to be backported to 1.7]

8 years agoMINOR: compression: fix -vv output without zlib/slz
Lukas Tribus [Wed, 11 Jan 2017 14:24:35 +0000 (14:24 +0000)] 
MINOR: compression: fix -vv output without zlib/slz

When haproxy is compiled without zlib or slz, the output of
haproxy -vv shows (null).

Make haproxy -vv output great again by providing the proper
information (which is what we did before).

This is for 1.8 only.

8 years agoDOC: add deprecation notice to "block"
Jarno Huuskonen [Wed, 28 Dec 2016 16:50:29 +0000 (18:50 +0200)] 
DOC: add deprecation notice to "block"

[wt: this one is in fact emulated using http-request deny. This
 patch can thus be backported to 1.7, 1.6 and 1.5 so that users
 of older versions do not add this keyword in their configs]

8 years agoMINOR: proto_http.c 502 error txt typo.
Jarno Huuskonen [Wed, 28 Dec 2016 08:49:01 +0000 (10:49 +0200)] 
MINOR: proto_http.c 502 error txt typo.

[wt: should be backported to 1.7 and 1.6 as it was introduced in 1.6-dev4]

8 years agoMINOR: Use "500 Internal Server Error" for 500 error/status code message.
Jarno Huuskonen [Mon, 9 Jan 2017 12:17:10 +0000 (14:17 +0200)] 
MINOR: Use "500 Internal Server Error" for 500 error/status code message.

Internal Server Error is what is in RFC 2616/7231.

8 years agoBUG/MINOR: ssl: assert on SSL_set_shutdown with BoringSSL
Emmanuel Hocdet [Sun, 8 Jan 2017 13:07:39 +0000 (14:07 +0100)] 
BUG/MINOR: ssl: assert on SSL_set_shutdown with BoringSSL

With BoringSSL:
SSL_set_shutdown: Assertion `(SSL_get_shutdown(ssl) & mode) == SSL_get_shutdown(ssl)' failed.

"SSL_set_shutdown causes ssl to behave as if the shutdown bitmask (see SSL_get_shutdown)
were mode. This may be used to skip sending or receiving close_notify in SSL_shutdown by
causing the implementation to believe the events already happened.
It is an error to use SSL_set_shutdown to unset a bit that has already been set.
Doing so will trigger an assert in debug builds and otherwise be ignored.
Use SSL_CTX_set_quiet_shutdown instead."

Change logic to not notify on SSL_shutdown when connection is not clean.

8 years agoBUG/MINOR: ssl: EVP_PKEY must be freed after X509_get_pubkey usage
Emmanuel Hocdet [Fri, 6 Jan 2017 11:57:46 +0000 (12:57 +0100)] 
BUG/MINOR: ssl: EVP_PKEY must be freed after X509_get_pubkey usage

"X509_get_pubkey() attempts to decode the public key for certificate x.
If successful it returns the public key as an EVP_PKEY pointer with its
reference count incremented: this means the returned key must be freed
up after use."

8 years agoBUG/MEDIUM: tools: do not force an unresolved address to AF_INET:0.0.0.0
Willy Tarreau [Fri, 6 Jan 2017 18:23:20 +0000 (19:23 +0100)] 
BUG/MEDIUM: tools: do not force an unresolved address to AF_INET:0.0.0.0

This prevents DNS from resolving IPv6-only servers in 1.7. Note, this
patch depends on the previous series :

  1. BUG/MINOR: tools: fix off-by-one in port size check
  2. BUG/MEDIUM: server: consider AF_UNSPEC as a valid address family
  3. MEDIUM: server: split the address and the port into two different fields
  4. MINOR: tools: make str2sa_range() return the port in a separate argument
  5. MINOR: server: take the destination port from the port field, not the addr
  6. MEDIUM: server: disable protocol validations when the server doesn't resolve

This fix (hence the whole series) must be backported to 1.7.

8 years agoMEDIUM: server: disable protocol validations when the server doesn't resolve
Willy Tarreau [Fri, 6 Jan 2017 17:42:57 +0000 (18:42 +0100)] 
MEDIUM: server: disable protocol validations when the server doesn't resolve

When a server doesn't resolve we don't know the address family so we
can't perform the basic protocol validations. However we know that we'll
ultimately resolve to AF_INET4 or AF_INET6 so the controls are OK. It is
important to proceed like this otherwise it will not be possible to start
with unresolved addresses.

8 years agoMINOR: server: take the destination port from the port field, not the addr
Willy Tarreau [Fri, 6 Jan 2017 17:36:06 +0000 (18:36 +0100)] 
MINOR: server: take the destination port from the port field, not the addr

Next patch will cause the port to disappear from the address field when servers
do not resolve so we need to take it from the separate field provided by
str2sa_range().

8 years agoMINOR: tools: make str2sa_range() return the port in a separate argument
Willy Tarreau [Fri, 6 Jan 2017 17:32:38 +0000 (18:32 +0100)] 
MINOR: tools: make str2sa_range() return the port in a separate argument

This will be needed so that we're don't have to extract it from the
returned address where it will not always be anymore (eg: for unresolved
servers).

8 years agoMEDIUM: server: split the address and the port into two different fields
Willy Tarreau [Fri, 6 Jan 2017 16:41:29 +0000 (17:41 +0100)] 
MEDIUM: server: split the address and the port into two different fields

Keeping the address and the port in the same field causes a lot of problems,
specifically on the DNS part where we're forced to cheat on the family to be
able to keep the port. This causes some issues such as some families not being
resolvable anymore.

This patch first moves the service port to a new field "svc_port" so that the
port field is never used anymore in the "addr" field (struct sockaddr_storage).
All call places were adapted (there aren't that many).

8 years agoBUG/MEDIUM: server: consider AF_UNSPEC as a valid address family
Willy Tarreau [Fri, 6 Jan 2017 18:18:32 +0000 (19:18 +0100)] 
BUG/MEDIUM: server: consider AF_UNSPEC as a valid address family

The DNS code is written so as to support AF_UNSPEC to decide on the
server family based on responses, but unfortunately snr_resolution_cb()
considers it as invalid causing a DNS storm to happen when a server
arrives with this family.

This situation is not supposed to happen as long as unresolved addresses
are forced to AF_INET, but this will change with the upcoming fixes and
it's possible that it's not granted already when changing an address on
the CLI.

This fix must be backported to 1.7 and 1.6.

8 years agoBUG/MINOR: tools: fix off-by-one in port size check
Willy Tarreau [Fri, 6 Jan 2017 15:46:22 +0000 (16:46 +0100)] 
BUG/MINOR: tools: fix off-by-one in port size check

port_to_str() checks that the port size is at least 5 characters instead
of at least 6. While in theory it could permit a buffer overflow, it's
harmless because all callers have at least 6 characters here.

This fix needs to be backported to 1.7, 1.6 and 1.5.

8 years agoBUG/MINOR: config: emit a warning if http-reuse is enabled with incompatible options
Willy Tarreau [Fri, 6 Jan 2017 11:21:38 +0000 (12:21 +0100)] 
BUG/MINOR: config: emit a warning if http-reuse is enabled with incompatible options

http-reuse should normally not be used in conjunction with the proxy
protocol or with "usesrc clientip". While there's nothing fundamentally
wrong with this, whenever these options are used, the server expects the
IP address to be the source address for all requests, which doesn't make
sense with http-reuse.