Hello community,
here is the log from the commit of package haproxy for openSUSE:Factory checked in at 2019-02-14 14:32:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/haproxy (Old)
and /work/SRC/openSUSE:Factory/.haproxy.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "haproxy"
Thu Feb 14 14:32:25 2019 rev:69 rq:674410 version:1.8.19~git0.ebf033b4
Changes:
--------
--- /work/SRC/openSUSE:Factory/haproxy/haproxy.changes 2019-01-11 14:05:24.199805224 +0100
+++ /work/SRC/openSUSE:Factory/.haproxy.new.28833/haproxy.changes 2019-02-14 14:32:42.543670397 +0100
@@ -1,0 +2,55 @@
+Mon Feb 11 15:16:38 UTC 2019 - kgronlund@suse.com
+
+- Update to version 1.8.19~git0.ebf033b4:
+ * [RELEASE] Released version 1.8.19
+ * BUG/MINOR: config: Reinforce validity check when a process number is parsed
+ * BUG/MAJOR: stream: avoid double free on unique_id
+ * BUG/MAJOR: spoe: Don't try to get agent config during SPOP healthcheck
+ * BUG/MEDIUM: server: initialize the idle conns list after parsing the config
+ * BUG/MEDIUM: spoe: initialization depending on nbthread must be done last
+ * BUG/MINOR: lua: initialize the correct idle conn lists for the SSL sockets
+ * BUG/MINOR: spoe: do not assume agent->rt is valid on exit
+ * DOC: ssl: Stop documenting ciphers example to use
+ * DOC: ssl: Clarify when pre TLSv1.3 cipher can be used
+ * [RELEASE] Released version 1.8.18
+ * BUG/MINOR: config: make sure to count the error on incorrect track-sc/stick rules
+ * BUG/MAJOR: spoe: verify that backends used by SPOE cover all their callers' processes
+ * BUG/MAJOR: config: verify that targets of track-sc and stick rules are present
+ * BUG/MINOR: config: fix bind line thread mask validation
+ * BUG/MEDIUM: stream: Don't forget to free s->unique_id in stream_free().
+ * BUG/MEDIUM: mux-h2: do not close the connection on aborted streams
+ * MINOR: connstream: have a new flag CS_FL_KILL_CONN to kill a connection
+ * MINOR: stream-int: add a new flag to mention that we want the connection to be killed
+ * MINOR: stream-int: expand the flags to 32-bit
+ * BUG/MEDIUM: mux-h2: wait for the mux buffer to be empty before closing the connection
+ * BUG/MEDIUM: mux-h2: make sure never to send GOAWAY on too old streams
+ * BUG/MEDIUM: mux-h2: fix two half-closed to closed transitions
+ * BUG/MEDIUM: mux-h2: wake up flow-controlled streams on initial window update
+ * MINOR: xref: Add missing barriers.
+ * BUG/MINOR: stream: don't close the front connection when facing a backend error
+ * SCRIPTS: add the issue tracker URL to the announce script
+ * SCRIPTS: add the slack channel URL to the announce script
+ * BUG/MINOR: deinit: tcp_rep.inspect_rules not deinit, add to deinit
+ * BUG/MINOR: spoe: corrected fragmentation string size
+ * DOC: nbthread is no longer experimental.
+ * BUG/MINOR: hpack: return a compression error on invalid table size updates
+ * BUG/MINOR: mux-h2: make it possible to set the error code on an already closed stream
+ * BUG/MINOR: mux-h2: headers-type frames in HREM are always a connection error
+ * BUG/MINOR: mux-h2: CONTINUATION in closed state must always return GOAWAY
+ * MINOR: h2: declare new sets of frame types
+ * MINOR: h2: add a bit-based frame type representation
+ * DOC: mention the effect of nf_conntrack_tcp_loose on src/dst
+ * BUG/MEDIUM: ssl: Fix handling of TLS 1.3 KeyUpdate messages
+ * BUG/MINOR: check: Wake the check task if the check is finished in wake_srv_chk()
+ * BUG/MINOR: server: don't always trust srv_check_health when loading a server state
+ * BUG/MINOR: stick_table: Prevent conn_cur from underflowing
+ * BUG/MINOR: backend: BE_LB_LKUP_CHTREE is a value, not a bit
+ * BUG/MINOR: backend: balance uri specific options were lost across defaults
+ * BUG/MINOR: backend: don't use url_param_name as a hint for BE_LB_ALGO_PH
+ * BUG/MEDIUM: ssl: missing allocation failure checks loading tls key file
+ * DOC: Be a bit more explicit about allow-0rtt security implications.
+ * BUG/MEDIUM: ssl: Disable anti-replay protection and set max data with 0RTT.
+ * BUG/MAJOR: cache: fix confusion between zero and uninitialized cache key
+ * DOC: http-request cache-use / http-response cache-store expects cache name
+
+-------------------------------------------------------------------
Old:
----
haproxy-1.8.17~git0.e89d25b2.tar.gz
New:
----
haproxy-1.8.19~git0.ebf033b4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ haproxy.spec ++++++
--- /var/tmp/diff_new_pack.KJJk9a/_old 2019-02-14 14:32:44.251669618 +0100
+++ /var/tmp/diff_new_pack.KJJk9a/_new 2019-02-14 14:32:44.251669618 +0100
@@ -47,7 +47,7 @@
%endif
Name: haproxy
-Version: 1.8.17~git0.e89d25b2
+Version: 1.8.19~git0.ebf033b4
Release: 0
#
#
++++++ _service ++++++
--- /var/tmp/diff_new_pack.KJJk9a/_old 2019-02-14 14:32:44.275669607 +0100
+++ /var/tmp/diff_new_pack.KJJk9a/_new 2019-02-14 14:32:44.279669605 +0100
@@ -6,7 +6,7 @@
<param name="versionformat">@PARENT_TAG@~git@TAG_OFFSET@.%h</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
- <param name="revision">v1.8.17</param>
+ <param name="revision">v1.8.19</param>
<param name="changesgenerate">enable</param>
</service>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.KJJk9a/_old 2019-02-14 14:32:44.295669598 +0100
+++ /var/tmp/diff_new_pack.KJJk9a/_new 2019-02-14 14:32:44.299669596 +0100
@@ -5,4 +5,4 @@
<param name="url">http://git.haproxy.org/git/haproxy-1.7.git</param>
<param name="changesrevision">640d526f8cdad00f7f5043b51f6a34f3f6ebb49f</param></service><service name="tar_scm">
<param name="url">http://git.haproxy.org/git/haproxy-1.8.git</param>
- <param name="changesrevision">e89d25b22da1eefa88ef5aa8ad6fa21e1bd4c801</param></service></servicedata>
\ No newline at end of file
+ <param name="changesrevision">ebf033b47d58aa04ae9913038c9369dab8740411</param></service></servicedata>
\ No newline at end of file
++++++ haproxy-1.8.17~git0.e89d25b2.tar.gz -> haproxy-1.8.19~git0.ebf033b4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/CHANGELOG new/haproxy-1.8.19~git0.ebf033b4/CHANGELOG
--- old/haproxy-1.8.17~git0.e89d25b2/CHANGELOG 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/CHANGELOG 2019-02-11 14:16:19.000000000 +0100
@@ -1,6 +1,58 @@
ChangeLog :
===========
+2019/02/11 : 1.8.19
+ - DOC: ssl: Clarify when pre TLSv1.3 cipher can be used
+ - DOC: ssl: Stop documenting ciphers example to use
+ - BUG/MINOR: spoe: do not assume agent->rt is valid on exit
+ - BUG/MINOR: lua: initialize the correct idle conn lists for the SSL sockets
+ - BUG/MEDIUM: spoe: initialization depending on nbthread must be done last
+ - BUG/MEDIUM: server: initialize the idle conns list after parsing the config
+ - BUG/MAJOR: spoe: Don't try to get agent config during SPOP healthcheck
+ - BUG/MAJOR: stream: avoid double free on unique_id
+ - BUG/MINOR: config: Reinforce validity check when a process number is parsed
+
+2019/02/06 : 1.8.18
+ - DOC: http-request cache-use / http-response cache-store expects cache name
+ - BUG/MAJOR: cache: fix confusion between zero and uninitialized cache key
+ - BUG/MEDIUM: ssl: Disable anti-replay protection and set max data with 0RTT.
+ - DOC: Be a bit more explicit about allow-0rtt security implications.
+ - BUG/MEDIUM: ssl: missing allocation failure checks loading tls key file
+ - BUG/MINOR: backend: don't use url_param_name as a hint for BE_LB_ALGO_PH
+ - BUG/MINOR: backend: balance uri specific options were lost across defaults
+ - BUG/MINOR: backend: BE_LB_LKUP_CHTREE is a value, not a bit
+ - BUG/MINOR: stick_table: Prevent conn_cur from underflowing
+ - BUG/MINOR: server: don't always trust srv_check_health when loading a server state
+ - BUG/MINOR: check: Wake the check task if the check is finished in wake_srv_chk()
+ - BUG/MEDIUM: ssl: Fix handling of TLS 1.3 KeyUpdate messages
+ - DOC: mention the effect of nf_conntrack_tcp_loose on src/dst
+ - MINOR: h2: add a bit-based frame type representation
+ - MINOR: h2: declare new sets of frame types
+ - BUG/MINOR: mux-h2: CONTINUATION in closed state must always return GOAWAY
+ - BUG/MINOR: mux-h2: headers-type frames in HREM are always a connection error
+ - BUG/MINOR: mux-h2: make it possible to set the error code on an already closed stream
+ - BUG/MINOR: hpack: return a compression error on invalid table size updates
+ - DOC: nbthread is no longer experimental.
+ - BUG/MINOR: spoe: corrected fragmentation string size
+ - BUG/MINOR: deinit: tcp_rep.inspect_rules not deinit, add to deinit
+ - SCRIPTS: add the slack channel URL to the announce script
+ - SCRIPTS: add the issue tracker URL to the announce script
+ - BUG/MINOR: stream: don't close the front connection when facing a backend error
+ - MINOR: xref: Add missing barriers.
+ - BUG/MEDIUM: mux-h2: wake up flow-controlled streams on initial window update
+ - BUG/MEDIUM: mux-h2: fix two half-closed to closed transitions
+ - BUG/MEDIUM: mux-h2: make sure never to send GOAWAY on too old streams
+ - BUG/MEDIUM: mux-h2: wait for the mux buffer to be empty before closing the connection
+ - MINOR: stream-int: expand the flags to 32-bit
+ - MINOR: stream-int: add a new flag to mention that we want the connection to be killed
+ - MINOR: connstream: have a new flag CS_FL_KILL_CONN to kill a connection
+ - BUG/MEDIUM: mux-h2: do not close the connection on aborted streams
+ - BUG/MEDIUM: stream: Don't forget to free s->unique_id in stream_free().
+ - BUG/MINOR: config: fix bind line thread mask validation
+ - BUG/MAJOR: config: verify that targets of track-sc and stick rules are present
+ - BUG/MAJOR: spoe: verify that backends used by SPOE cover all their callers' processes
+ - BUG/MINOR: config: make sure to count the error on incorrect track-sc/stick rules
+
2019/01/08 : 1.8.17
- BUG/MAJOR: stream-int: Update the stream expiration date in stream_int_notify()
- MINOR: mux-h2: only increase the connection window with the first update
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/README new/haproxy-1.8.19~git0.ebf033b4/README
--- old/haproxy-1.8.17~git0.e89d25b2/README 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/README 2019-02-11 14:16:19.000000000 +0100
@@ -3,7 +3,7 @@
----------------------
version 1.8
willy tarreau
- 2019/01/08
+ 2019/02/11
1) How to build it
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/VERDATE new/haproxy-1.8.19~git0.ebf033b4/VERDATE
--- old/haproxy-1.8.17~git0.e89d25b2/VERDATE 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/VERDATE 2019-02-11 14:16:19.000000000 +0100
@@ -1,2 +1,2 @@
$Format:%ci$
-2019/01/08
+2019/02/11
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/VERSION new/haproxy-1.8.19~git0.ebf033b4/VERSION
--- old/haproxy-1.8.17~git0.e89d25b2/VERSION 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/VERSION 2019-02-11 14:16:19.000000000 +0100
@@ -1 +1 @@
-1.8.17
+1.8.19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/doc/configuration.txt new/haproxy-1.8.19~git0.ebf033b4/doc/configuration.txt
--- old/haproxy-1.8.17~git0.e89d25b2/doc/configuration.txt 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/doc/configuration.txt 2019-02-11 14:16:19.000000000 +0100
@@ -4,7 +4,7 @@
----------------------
version 1.8
willy tarreau
- 2019/01/08
+ 2019/02/11
This document covers the configuration language as implemented in the version
@@ -917,14 +917,14 @@
mode. By default, only one process is created, which is the recommended mode
of operation. For systems limited to small sets of file descriptors per
process, it may be needed to fork multiple daemons. USING MULTIPLE PROCESSES
- IS HARDER TO DEBUG AND IS REALLY DISCOURAGED. See also "daemon".
+ IS HARDER TO DEBUG AND IS REALLY DISCOURAGED. See also "daemon" and
+ "nbthread".
nbthread <number>
This setting is only available when support for threads was built in. It
creates <number> threads for each created processes. It means if HAProxy is
started in foreground, it only creates <number> threads for the first
- process. FOR NOW, THREADS SUPPORT IN HAPROXY IS HIGHLY EXPERIMENTAL AND IT
- MUST BE ENABLED WITH CAUTION AND AT YOUR OWN RISK. See also "nbproc".
+ process. See also "nbproc".
pidfile <pidfile>
Writes PIDs of all daemons into file <pidfile>. This option is equivalent to
@@ -986,12 +986,14 @@
ssl-default-bind-ciphers <ciphers>
This setting is only available when support for OpenSSL was built in. It sets
the default string describing the list of cipher algorithms ("cipher suite")
- that are negotiated during the SSL/TLS handshake except for TLSv1.3 for all
+ that are negotiated during the SSL/TLS handshake up to TLSv1.2 for all
"bind" lines which do not explicitly define theirs. The format of the string
- is defined in "man 1 ciphers" from OpenSSL man pages, and can be for instance
- a string such as "AES:ALL:!aNULL:!eNULL:+RC4:@STRENGTH" (without quotes). For
- TLSv1.3 cipher configuration, please check the "ssl-default-bind-ciphersuites"
- keyword. Please check the "bind" keyword for more information.
+ is defined in "man 1 ciphers" from OpenSSL man pages. For background
+ information and recommendations see e.g.
+ (https://wiki.mozilla.org/Security/Server_Side_TLS) and
+ (https://mozilla.github.io/server-side-tls/ssl-config-generator/). For TLSv1.3
+ cipher configuration, please check the "ssl-default-bind-ciphersuites" keyword.
+ Please check the "bind" keyword for more information.
ssl-default-bind-ciphersuites <ciphersuites>
This setting is only available when support for OpenSSL was built in and
@@ -999,11 +1001,9 @@
describing the list of cipher algorithms ("cipher suite") that are negotiated
during the TLSv1.3 handshake for all "bind" lines which do not explicitly define
theirs. The format of the string is defined in
- "man 1 ciphers" from OpenSSL man pages under the section "ciphersuites", and can
- be for instance a string such as
- "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
- (without quotes). For cipher configuration for TLSv1.2 and earlier, please check
- the "ssl-default-bind-ciphers" keyword. Please check the "bind" keyword for more
+ "man 1 ciphers" from OpenSSL man pages under the section "ciphersuites". For
+ cipher configuration for TLSv1.2 and earlier, please check the
+ "ssl-default-bind-ciphers" keyword. Please check the "bind" keyword for more
information.
ssl-default-bind-options [<option>]...
@@ -1018,11 +1018,15 @@
ssl-default-server-ciphers <ciphers>
This setting is only available when support for OpenSSL was built in. It
sets the default string describing the list of cipher algorithms that are
- negotiated during the SSL/TLS handshake except for TLSv1.3 with the server,
+ negotiated during the SSL/TLS handshake up to TLSv1.2 with the server,
for all "server" lines which do not explicitly define theirs. The format of
- the string is defined in "man 1 ciphers". For TLSv1.3 cipher configuration,
- please check the "ssl-default-server-ciphersuites" keyword. Please check the
- "server" keyword for more information.
+ the string is defined in "man 1 ciphers" from OpenSSL man pages. For background
+ information and recommendations see e.g.
+ (https://wiki.mozilla.org/Security/Server_Side_TLS) and
+ (https://mozilla.github.io/server-side-tls/ssl-config-generator/).
+ For TLSv1.3 cipher configuration, please check the
+ "ssl-default-server-ciphersuites" keyword. Please check the "server" keyword
+ for more information.
ssl-default-server-ciphersuites <ciphersuites>
This setting is only available when support for OpenSSL was built in and
@@ -1030,9 +1034,10 @@
string describing the list of cipher algorithms that are negotiated during
the TLSv1.3 handshake with the server, for all "server" lines which do not
explicitly define theirs. The format of the string is defined in
- "man 1 ciphers" under the "ciphersuites" section. For cipher configuration for
- TLSv1.2 and earlier, please check the "ssl-default-server-ciphers" keyword.
- Please check the "server" keyword for more information.
+ "man 1 ciphers" from OpenSSL man pages under the section "ciphersuites". For
+ cipher configuration for TLSv1.2 and earlier, please check the
+ "ssl-default-server-ciphers" keyword. Please check the "server" keyword for
+ more information.
ssl-default-server-options [<option>]...
This setting is only available when support for OpenSSL was built in. It sets
@@ -10483,7 +10488,10 @@
allow-0rtt
Allow receiving early data when using TLSv1.3. This is disabled by default,
- due to security considerations.
+ due to security considerations. Because it is vulnerable to replay attacks,
+ you should only allow if for requests that are safe to replay, ie requests
+ that are idempotent. You can use the "wait-for-handshake" action for any
+ request that wouldn't be safe with early data.
alpn <protocols>
This enables the TLS ALPN extension and advertises the specified protocol
@@ -10545,11 +10553,8 @@
ciphers <ciphers>
This setting is only available when support for OpenSSL was built in. It sets
the string describing the list of cipher algorithms ("cipher suite") that are
- negotiated during the SSL/TLS handshake except for TLSv1.3. The format of the
- string is defined in "man 1 ciphers" from OpenSSL man pages, and can be for
- instance a string such as "AES:ALL:!aNULL:!eNULL:+RC4:@STRENGTH" (without
- quotes). Depending on the compatibility and security requirements, the list
- of suitable ciphers depends on a variety of variables. For background
+ negotiated during the SSL/TLS handshake up to TLSv1.2. The format of the
+ string is defined in "man 1 ciphers" from OpenSSL man pages. For background
information and recommendations see e.g.
(https://wiki.mozilla.org/Security/Server_Side_TLS) and
(https://mozilla.github.io/server-side-tls/ssl-config-generator/). For TLSv1.3
@@ -10560,11 +10565,8 @@
OpenSSL 1.1.1 or later was used to build HAProxy. It sets the string describing
the list of cipher algorithms ("cipher suite") that are negotiated during the
TLSv1.3 handshake. The format of the string is defined in "man 1 ciphers" from
- OpenSSL man pages under the "ciphersuites" section, and can be for instance a
- string such as
- "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
- (without quotes). For cipher configuration for TLSv1.2 and earlier, please check
- the "ciphers" keyword.
+ OpenSSL man pages under the "ciphersuites" section. For cipher configuration
+ for TLSv1.2 and earlier, please check the "ciphers" keyword.
crl-file <crlfile>
This setting is only available when support for OpenSSL was built in. It
@@ -11278,19 +11280,20 @@
This setting is only available when support for OpenSSL was built in. This
option sets the string describing the list of cipher algorithms that is
negotiated during the SSL/TLS handshake with the server. The format of the
- string is defined in "man 1 ciphers". When SSL is used to communicate with
- servers on the local network, it is common to see a weaker set of algorithms
- than what is used over the internet. Doing so reduces CPU usage on both the
- server and haproxy while still keeping it compatible with deployed software.
- Some algorithms such as RC4-SHA1 are reasonably cheap. If no security at all
- is needed and just connectivity, using DES can be appropriate.
+ string is defined in "man 1 ciphers" from OpenSSL man pages. For background
+ information and recommendations see e.g.
+ (https://wiki.mozilla.org/Security/Server_Side_TLS) and
+ (https://mozilla.github.io/server-side-tls/ssl-config-generator/). For TLSv1.3
+ cipher configuration, please check the "ciphersuites" keyword.
ciphersuites <ciphersuites>
This setting is only available when support for OpenSSL was built in and
OpenSSL 1.1.1 or later was used to build HAProxy. This option sets the string
describing the list of cipher algorithms that is negotiated during the TLS
1.3 handshake with the server. The format of the string is defined in
- "man 1 ciphers" under the "ciphersuites" section.
+ "man 1 ciphers" from OpenSSL man pages under the "ciphersuites" section.
+ For cipher configuration for TLSv1.2 and earlier, please check the "ciphers"
+ keyword.
cookie <value>
The "cookie" parameter sets the cookie value assigned to the server to
@@ -13819,7 +13822,12 @@
which is the address the client connected to. It can be useful when running
in transparent mode. It is of type IP and works on both IPv4 and IPv6 tables.
On IPv6 tables, IPv4 address is mapped to its IPv6 equivalent, according to
- RFC 4291.
+ RFC 4291. When the incoming connection passed through address translation or
+ redirection involving connection tracking, the original destination address
+ before the redirection will be reported. On Linux systems, the source and
+ destination may seldom appear reversed if the nf_conntrack_tcp_loose sysctl
+ is set, because a late response may reopen a timed out connection and switch
+ what is believed to be the source and the destination.
dst_conn : integer
Returns an integer value corresponding to the number of currently established
@@ -14124,7 +14132,13 @@
behind a proxy. However if the "accept-proxy" or "accept-netscaler-cip" bind
directive is used, it can be the address of a client behind another
PROXY-protocol compatible component for all rule sets except
- "tcp-request connection" which sees the real address.
+ "tcp-request connection" which sees the real address. When the incoming
+ connection passed through address translation or redirection involving
+ connection tracking, the original destination address before the redirection
+ will be reported. On Linux systems, the source and destination may seldom
+ appear reversed if the nf_conntrack_tcp_loose sysctl is set, because a late
+ response may reopen a timed out connection and switch what is believed to be
+ the source and the destination.
Example:
# add an HTTP header in requests with the originating address' country
@@ -17157,13 +17171,13 @@
10.2.2. Proxy section
---------------------
-http-request cache-use <name>
+http-request cache-use <name> [ { if | unless } <condition> ]
Try to deliver a cached object from the cache <name>. This directive is also
mandatory to store the cache as it calculates the cache hash. If you want to
use a condition for both storage and delivering that's a good idea to put it
after this one.
-http-response cache-store <name>
+http-response cache-store <name> [ { if | unless } <condition> ]
Store an http-response within the cache. The storage of the response headers
is done at this step, which means you can use others http-response actions
to modify headers before or after the storage of the response. This action
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/examples/haproxy.spec new/haproxy-1.8.19~git0.ebf033b4/examples/haproxy.spec
--- old/haproxy-1.8.17~git0.e89d25b2/examples/haproxy.spec 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/examples/haproxy.spec 2019-02-11 14:16:19.000000000 +0100
@@ -1,6 +1,6 @@
Summary: HA-Proxy is a TCP/HTTP reverse proxy for high availability environments
Name: haproxy
-Version: 1.8.17
+Version: 1.8.19
Release: 1
License: GPL
Group: System Environment/Daemons
@@ -74,6 +74,12 @@
%attr(0755,root,root) %config %{_sysconfdir}/rc.d/init.d/%{name}
%changelog
+* Mon Feb 11 2019 Willy Tarreau
+- updated to 1.8.19
+
+* Wed Feb 6 2019 Willy Tarreau
+- updated to 1.8.18
+
* Tue Jan 8 2019 Willy Tarreau
- updated to 1.8.17
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/common/h2.h new/haproxy-1.8.19~git0.ebf033b4/include/common/h2.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/common/h2.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/common/h2.h 2019-02-11 14:16:19.000000000 +0100
@@ -81,6 +81,30 @@
H2_FT_ENTRIES /* must be last */
} __attribute__((packed));
+/* frame types, turned to bits or bit fields */
+enum {
+ /* one bit per frame type */
+ H2_FT_DATA_BIT = 1U << H2_FT_DATA,
+ H2_FT_HEADERS_BIT = 1U << H2_FT_HEADERS,
+ H2_FT_PRIORITY_BIT = 1U << H2_FT_PRIORITY,
+ H2_FT_RST_STREAM_BIT = 1U << H2_FT_RST_STREAM,
+ H2_FT_SETTINGS_BIT = 1U << H2_FT_SETTINGS,
+ H2_FT_PUSH_PROMISE_BIT = 1U << H2_FT_PUSH_PROMISE,
+ H2_FT_PING_BIT = 1U << H2_FT_PING,
+ H2_FT_GOAWAY_BIT = 1U << H2_FT_GOAWAY,
+ H2_FT_WINDOW_UPDATE_BIT = 1U << H2_FT_WINDOW_UPDATE,
+ H2_FT_CONTINUATION_BIT = 1U << H2_FT_CONTINUATION,
+ /* padded frames */
+ H2_FT_PADDED_MASK = H2_FT_DATA_BIT | H2_FT_HEADERS_BIT | H2_FT_PUSH_PROMISE_BIT,
+ /* flow controlled frames */
+ H2_FT_FC_MASK = H2_FT_DATA_BIT,
+ /* header frames */
+ H2_FT_HDR_MASK = H2_FT_HEADERS_BIT | H2_FT_PUSH_PROMISE_BIT | H2_FT_CONTINUATION_BIT,
+ /* frames allowed to arrive late on a stream */
+ H2_FT_LATE_MASK = H2_FT_WINDOW_UPDATE_BIT | H2_FT_RST_STREAM_BIT | H2_FT_PRIORITY_BIT,
+};
+
+
/* flags defined for each frame type */
// RFC7540 #6.1
@@ -109,6 +133,9 @@
// RFC7540 #6.8 : GOAWAY defines no flags
// RFC7540 #6.9 : WINDOW_UPDATE defines no flags
+// PADDED is the exact same among DATA, HEADERS and PUSH_PROMISE (8)
+#define H2_F_PADDED 0x08
+
/* HTTP/2 error codes - RFC7540 #7 */
enum h2_err {
H2_ERR_NO_ERROR = 0x0,
@@ -159,6 +186,12 @@
* Some helpful debugging functions.
*/
+/* returns a bit corresponding to the frame type */
+static inline unsigned int h2_ft_bit(enum h2_ft ft)
+{
+ return 1U << ft;
+}
+
/* returns the frame type as a string */
static inline const char *h2_ft_str(int type)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/common/hpack-tbl.h new/haproxy-1.8.19~git0.ebf033b4/include/common/hpack-tbl.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/common/hpack-tbl.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/common/hpack-tbl.h 2019-02-11 14:16:19.000000000 +0100
@@ -127,6 +127,7 @@
HPACK_ERR_MISSING_AUTHORITY, /* :authority is missing with CONNECT */
HPACK_ERR_SCHEME_NOT_ALLOWED, /* :scheme not allowed with CONNECT */
HPACK_ERR_PATH_NOT_ALLOWED, /* :path not allowed with CONNECT */
+ HPACK_ERR_INVALID_ARGUMENT, /* an invalid argument was passed */
};
/* static header table as in RFC7541 Appendix A. [0] unused. */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/common/xref.h new/haproxy-1.8.19~git0.ebf033b4/include/common/xref.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/common/xref.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/common/xref.h 2019-02-11 14:16:19.000000000 +0100
@@ -32,6 +32,7 @@
/* Get the local pointer to the peer. */
local = HA_ATOMIC_XCHG(&xref->peer, XREF_BUSY);
+ __ha_barrier_store();
/* If the local pointer is NULL, the peer no longer exists. */
if (local == NULL) {
@@ -53,6 +54,7 @@
/* The remote lock is BUSY, We retry the process. */
if (remote == XREF_BUSY) {
xref->peer = local;
+ __ha_barrier_store();
continue;
}
@@ -66,6 +68,8 @@
/* Release the peer. */
peer->peer = xref;
+ __ha_barrier_store();
+
/* Release myself. */
xref->peer = peer;
}
@@ -73,6 +77,7 @@
static inline void xref_disconnect(struct xref *xref, struct xref *peer)
{
peer->peer = NULL;
+ __ha_barrier_store();
xref->peer = NULL;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/proto/session.h new/haproxy-1.8.19~git0.ebf033b4/include/proto/session.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/proto/session.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/proto/session.h 2019-02-11 14:16:19.000000000 +0100
@@ -59,7 +59,8 @@
if (ptr) {
HA_RWLOCK_WRLOCK(STK_SESS_LOCK, &ts->lock);
- stktable_data_cast(ptr, conn_cur)--;
+ if (stktable_data_cast(ptr, conn_cur) > 0)
+ stktable_data_cast(ptr, conn_cur)--;
HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/proto/stream.h new/haproxy-1.8.19~git0.ebf033b4/include/proto/stream.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/proto/stream.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/proto/stream.h 2019-02-11 14:16:19.000000000 +0100
@@ -104,7 +104,8 @@
if (ptr) {
HA_RWLOCK_WRLOCK(STK_SESS_LOCK, &ts->lock);
- stktable_data_cast(ptr, conn_cur)--;
+ if (stktable_data_cast(ptr, conn_cur) > 0)
+ stktable_data_cast(ptr, conn_cur)--;
HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock);
@@ -142,7 +143,8 @@
if (ptr) {
HA_RWLOCK_WRLOCK(STK_SESS_LOCK, &ts->lock);
- stktable_data_cast(ptr, conn_cur)--;
+ if (stktable_data_cast(ptr, conn_cur) > 0)
+ stktable_data_cast(ptr, conn_cur)--;
HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/proto/stream_interface.h new/haproxy-1.8.19~git0.ebf033b4/include/proto/stream_interface.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/proto/stream_interface.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/proto/stream_interface.h 2019-02-11 14:16:19.000000000 +0100
@@ -320,6 +320,12 @@
si->ops->shutw(si);
}
+/* Marks on the stream-interface that next shutw must kill the whole connection */
+static inline void si_must_kill_conn(struct stream_interface *si)
+{
+ si->flags |= SI_FL_KILL_CONN;
+}
+
/* Updates the stream interface and timers, then updates the data layer below */
static inline void si_update(struct stream_interface *si)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/types/connection.h new/haproxy-1.8.19~git0.ebf033b4/include/types/connection.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/types/connection.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/types/connection.h 2019-02-11 14:16:19.000000000 +0100
@@ -70,6 +70,7 @@
CS_FL_ERROR = 0x00000100, /* a fatal error was reported */
CS_FL_RCV_MORE = 0x00000200, /* more bytes to receive but not enough room */
CS_FL_EOS = 0x00001000, /* End of stream */
+ CS_FL_KILL_CONN = 0x00002000, /* must kill the connection when the CS closes */
};
/* cs_shutr() modes */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/include/types/stream_interface.h new/haproxy-1.8.19~git0.ebf033b4/include/types/stream_interface.h
--- old/haproxy-1.8.17~git0.e89d25b2/include/types/stream_interface.h 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/include/types/stream_interface.h 2019-02-11 14:16:19.000000000 +0100
@@ -59,22 +59,23 @@
SI_ET_DATA_ABRT = 0x0400, /* data phase aborted by external cause */
};
-/* flags set after I/O (16 bit) */
+/* flags set after I/O (32 bit) */
enum {
- SI_FL_NONE = 0x0000, /* nothing */
- SI_FL_EXP = 0x0001, /* timeout has expired */
- SI_FL_ERR = 0x0002, /* a non-recoverable error has occurred */
- SI_FL_WAIT_ROOM = 0x0004, /* waiting for space to store incoming data */
- SI_FL_WAIT_DATA = 0x0008, /* waiting for more data to send */
- SI_FL_ISBACK = 0x0010, /* 0 for front-side SI, 1 for back-side */
- SI_FL_DONT_WAKE = 0x0020, /* resync in progress, don't wake up */
- SI_FL_INDEP_STR = 0x0040, /* independent streams = don't update rex on write */
- SI_FL_NOLINGER = 0x0080, /* may close without lingering. One-shot. */
- SI_FL_NOHALF = 0x0100, /* no half close, close both sides at once */
- SI_FL_SRC_ADDR = 0x1000, /* get the source ip/port with getsockname */
- SI_FL_WANT_PUT = 0x2000, /* an applet would like to put some data into the buffer */
- SI_FL_WANT_GET = 0x4000, /* an applet would like to get some data from the buffer */
- SI_FL_CLEAN_ABRT = 0x8000, /* SI_FL_ERR is used to report aborts, and not SHUTR */
+ SI_FL_NONE = 0x00000000, /* nothing */
+ SI_FL_EXP = 0x00000001, /* timeout has expired */
+ SI_FL_ERR = 0x00000002, /* a non-recoverable error has occurred */
+ SI_FL_WAIT_ROOM = 0x00000004, /* waiting for space to store incoming data */
+ SI_FL_WAIT_DATA = 0x00000008, /* waiting for more data to send */
+ SI_FL_ISBACK = 0x00000010, /* 0 for front-side SI, 1 for back-side */
+ SI_FL_DONT_WAKE = 0x00000020, /* resync in progress, don't wake up */
+ SI_FL_INDEP_STR = 0x00000040, /* independent streams = don't update rex on write */
+ SI_FL_NOLINGER = 0x00000080, /* may close without lingering. One-shot. */
+ SI_FL_NOHALF = 0x00000100, /* no half close, close both sides at once */
+ SI_FL_SRC_ADDR = 0x00001000, /* get the source ip/port with getsockname */
+ SI_FL_WANT_PUT = 0x00002000, /* an applet would like to put some data into the buffer */
+ SI_FL_WANT_GET = 0x00004000, /* an applet would like to get some data from the buffer */
+ SI_FL_CLEAN_ABRT = 0x00008000, /* SI_FL_ERR is used to report aborts, and not SHUTR */
+ SI_FL_KILL_CONN = 0x00010000, /* next shutw must kill the whole conn, not just the stream */
};
/* A stream interface has 3 parts :
@@ -92,10 +93,11 @@
/* struct members used by the "buffer" side */
enum si_state state; /* SI_ST* */
enum si_state prev_state;/* SI_ST*, copy of previous state */
- unsigned short flags; /* SI_FL_* */
- unsigned int exp; /* wake up time for connect, queue, turn-around, ... */
+ /* 16-bit hole here */
+ unsigned int flags; /* SI_FL_* */
enum obj_type *end; /* points to the end point (connection or appctx) */
struct si_ops *ops; /* general operations at the stream interface layer */
+ unsigned int exp; /* wake up time for connect, queue, turn-around, ... */
/* struct members below are the "remote" part, as seen from the buffer side */
unsigned int err_type; /* first error detected, one of SI_ET_* */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/scripts/announce-release new/haproxy-1.8.19~git0.ebf033b4/scripts/announce-release
--- old/haproxy-1.8.17~git0.e89d25b2/scripts/announce-release 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/scripts/announce-release 2019-02-11 14:16:19.000000000 +0100
@@ -155,6 +155,8 @@
(echo "Please find the usual URLs below :"
echo " Site index : http://www.haproxy.org/"
echo " Discourse : http://discourse.haproxy.org/"
+ echo " Slack channel : https://slack.haproxy.org/"
+ echo " Issue tracker : https://github.com/haproxy/haproxy/issues"
echo " Sources : http://www.haproxy.org/download/${BRANCH}/src/"
echo " Git repository : http://git.haproxy.org/git/${gitdir}/"
echo " Git Web browsing : http://git.haproxy.org/?p=${gitdir}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/action.c new/haproxy-1.8.19~git0.ebf033b4/src/action.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/action.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/action.c 2019-02-11 14:16:19.000000000 +0100
@@ -51,6 +51,11 @@
trk_idx(rule->action));
return 0;
}
+ else if (px->bind_proc & ~target->bind_proc) {
+ memprintf(err, "stick-table '%s' referenced by 'track-sc%d' rule not present on all processes covered by proxy '%s'",
+ target->id, trk_idx(rule->action), px->id);
+ return 0;
+ }
else {
free(rule->arg.trk_ctr.table.n);
rule->arg.trk_ctr.table.t = &target->table;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/backend.c new/haproxy-1.8.19~git0.ebf033b4/src/backend.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/backend.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/backend.c 2019-02-11 14:16:19.000000000 +0100
@@ -183,7 +183,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
h = full_hash(h);
hash_done:
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, h, avoid);
else
return map_get_server_hash(px, h);
@@ -236,7 +236,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
hash = full_hash(hash);
hash_done:
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, hash, avoid);
else
return map_get_server_hash(px, hash);
@@ -293,7 +293,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
hash = full_hash(hash);
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, hash, avoid);
else
return map_get_server_hash(px, hash);
@@ -367,7 +367,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
hash = full_hash(hash);
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, hash, avoid);
else
return map_get_server_hash(px, hash);
@@ -463,7 +463,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
hash = full_hash(hash);
hash_done:
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, hash, avoid);
else
return map_get_server_hash(px, hash);
@@ -507,7 +507,7 @@
if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
hash = full_hash(hash);
hash_done:
- if (px->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((px->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
return chash_get_server_hash(px, hash, avoid);
else
return map_get_server_hash(px, hash);
@@ -615,7 +615,7 @@
case BE_LB_LKUP_CHTREE:
case BE_LB_LKUP_MAP:
if ((s->be->lbprm.algo & BE_LB_KIND) == BE_LB_KIND_RR) {
- if (s->be->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((s->be->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
srv = chash_get_next_server(s->be, prev_srv);
else
srv = map_get_server_rr(s->be, prev_srv);
@@ -691,7 +691,7 @@
* back to round robin on the map.
*/
if (!srv) {
- if (s->be->lbprm.algo & BE_LB_LKUP_CHTREE)
+ if ((s->be->lbprm.algo & BE_LB_LKUP) == BE_LB_LKUP_CHTREE)
srv = chash_get_next_server(s->be, prev_srv);
else
srv = map_get_server_rr(s->be, prev_srv);
@@ -1516,6 +1516,8 @@
curproxy->lbprm.algo |= BE_LB_ALGO_UH;
curproxy->uri_whole = 0;
+ curproxy->uri_len_limit = 0;
+ curproxy->uri_dirs_depth1 = 0;
while (*args[arg]) {
if (!strcmp(args[arg], "len")) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/cache.c new/haproxy-1.8.19~git0.ebf033b4/src/cache.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/cache.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/cache.c 2019-02-11 14:16:19.000000000 +0100
@@ -400,7 +400,7 @@
struct cache *cache = (struct cache *)rule->arg.act.p[0];
struct shared_context *shctx = shctx_ptr(cache);
struct cache_entry *object;
-
+ unsigned int key = *(unsigned int *)txn->cache_hash;
/* Don't cache if the response came from a cache */
if ((obj_type(s->target) == OBJ_TYPE_APPLET) &&
@@ -420,6 +420,10 @@
if (txn->meth != HTTP_METH_GET)
goto out;
+ /* cache key was not computed */
+ if (!key)
+ goto out;
+
/* cache only 200 status code */
if (txn->status != 200)
goto out;
@@ -478,7 +482,7 @@
cache_ctx->first_block = first;
- object->eb.key = (*(unsigned int *)&txn->cache_hash);
+ object->eb.key = key;
memcpy(object->hash, txn->cache_hash, sizeof(object->hash));
/* Insert the node later on caching success */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/cfgparse.c new/haproxy-1.8.19~git0.ebf033b4/src/cfgparse.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/cfgparse.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/cfgparse.c 2019-02-11 14:16:19.000000000 +0100
@@ -613,16 +613,20 @@
else if (strcmp(arg, "even") == 0)
*proc |= (~0UL/3UL) << 1; /* 0xAAA...AAA */
else {
- char *dash;
+ const char *p, *dash = NULL;
unsigned int low, high;
- if (!isdigit((int)*arg)) {
- memprintf(err, "'%s' is not a valid number.\n", arg);
- return -1;
+ for (p = arg; *p; p++) {
+ if (*p == '-' && !dash)
+ dash = p;
+ else if (!isdigit((int)*p)) {
+ memprintf(err, "'%s' is not a valid number/range.", arg);
+ return -1;
+ }
}
low = high = str2uic(arg);
- if ((dash = strchr(arg, '-')) != NULL)
+ if (dash)
high = ((!*(dash+1)) ? LONGBITS : str2uic(dash + 1));
if (high < low) {
@@ -2844,7 +2848,10 @@
if (defproxy.url_param_name)
curproxy->url_param_name = strdup(defproxy.url_param_name);
- curproxy->url_param_len = defproxy.url_param_len;
+ curproxy->url_param_len = defproxy.url_param_len;
+ curproxy->uri_whole = defproxy.uri_whole;
+ curproxy->uri_len_limit = defproxy.uri_len_limit;
+ curproxy->uri_dirs_depth1 = defproxy.uri_dirs_depth1;
if (defproxy.hh_name)
curproxy->hh_name = strdup(defproxy.hh_name);
@@ -7648,9 +7655,9 @@
/* detect and address thread affinity inconsistencies */
nbproc = 0;
if (bind_conf->bind_proc)
- nbproc = my_ffsl(bind_conf->bind_proc);
+ nbproc = my_ffsl(bind_conf->bind_proc) - 1;
- mask = bind_conf->bind_thread[nbproc - 1];
+ mask = bind_conf->bind_thread[nbproc];
if (mask && !(mask & all_threads_mask)) {
unsigned long new_mask = 0;
@@ -7996,6 +8003,11 @@
curproxy->id, mrule->table.name ? mrule->table.name : curproxy->id);
cfgerr++;
}
+ else if (curproxy->bind_proc & ~target->bind_proc) {
+ ha_alert("Proxy '%s': stick-table '%s' referenced 'stick-store' rule not present on all processes covered by proxy '%s'.\n",
+ curproxy->id, target->id, curproxy->id);
+ cfgerr++;
+ }
else {
free((void *)mrule->table.name);
mrule->table.t = &(target->table);
@@ -8029,6 +8041,11 @@
curproxy->id, mrule->table.name ? mrule->table.name : curproxy->id);
cfgerr++;
}
+ else if (curproxy->bind_proc & ~target->bind_proc) {
+ ha_alert("Proxy '%s': stick-table '%s' referenced 'stick-store' rule not present on all processes covered by proxy '%s'.\n",
+ curproxy->id, target->id, curproxy->id);
+ cfgerr++;
+ }
else {
free((void *)mrule->table.name);
mrule->table.t = &(target->table);
@@ -8829,6 +8846,33 @@
}
}
}
+
+ /* initialize idle conns lists */
+ for (newsrv = curproxy->srv; newsrv; newsrv = newsrv->next) {
+ int i;
+
+ newsrv->priv_conns = calloc(global.nbthread, sizeof(*newsrv->priv_conns));
+ newsrv->idle_conns = calloc(global.nbthread, sizeof(*newsrv->idle_conns));
+ newsrv->safe_conns = calloc(global.nbthread, sizeof(*newsrv->safe_conns));
+
+ if (!newsrv->priv_conns || !newsrv->idle_conns || !newsrv->safe_conns) {
+ free(newsrv->safe_conns); newsrv->safe_conns = NULL;
+ free(newsrv->idle_conns); newsrv->idle_conns = NULL;
+ free(newsrv->priv_conns); newsrv->priv_conns = NULL;
+ ha_alert("parsing [%s:%d] : failed to allocate idle connections for server '%s'.\n",
+ newsrv->conf.file, newsrv->conf.line, newsrv->id);
+ cfgerr++;
+ continue;
+ }
+
+ for (i = 0; i < global.nbthread; i++) {
+ LIST_INIT(&newsrv->priv_conns[i]);
+ LIST_INIT(&newsrv->idle_conns[i]);
+ LIST_INIT(&newsrv->safe_conns[i]);
+ }
+
+ LIST_INIT(&newsrv->update_status);
+ }
}
/***********************************************************/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/checks.c new/haproxy-1.8.19~git0.ebf033b4/src/checks.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/checks.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/checks.c 2019-02-11 14:16:19.000000000 +0100
@@ -1403,12 +1403,13 @@
}
if (check->result != CHK_RES_UNKNOWN) {
- /* We're here because nobody wants to handle the error, so we
- * sure want to abort the hard way.
- */
+ /* Check complete or aborted. If connection not yet closed do it
+ * now and wake the check task up to be sure the result is
+ * handled ASAP. */
conn_sock_drain(conn);
cs_close(cs);
ret = -1;
+ task_wakeup(check->task, TASK_WOKEN_IO);
}
HA_SPIN_UNLOCK(SERVER_LOCK, &check->server->lock);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/flt_spoe.c new/haproxy-1.8.19~git0.ebf033b4/src/flt_spoe.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/flt_spoe.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/flt_spoe.c 2019-02-11 14:16:19.000000000 +0100
@@ -170,8 +170,10 @@
LIST_DEL(&grp->list);
spoe_release_group(grp);
}
- for (i = 0; i < global.nbthread; ++i)
- HA_SPIN_DESTROY(&agent->rt[i].lock);
+ if (agent->rt) {
+ for (i = 0; i < global.nbthread; ++i)
+ HA_SPIN_DESTROY(&agent->rt[i].lock);
+ }
free(agent->rt);
free(agent);
}
@@ -444,7 +446,7 @@
if (agent != NULL && (agent->flags & SPOE_FL_RCV_FRAGMENTATION)) {
if (chk->len) chk->str[chk->len++] = ',';
memcpy(chk->str+chk->len, "fragmentation", 13);
- chk->len += 5;
+ chk->len += 13;
}
if (spoe_encode_buffer(chk->str, chk->len, &p, end) == -1)
goto too_big;
@@ -817,10 +819,14 @@
SPOE_APPCTX(appctx)->status_code = SPOE_FRM_ERR_NO_FRAME_SIZE;
return -1;
}
- if ((flags & SPOE_APPCTX_FL_PIPELINING) && !(agent->flags & SPOE_FL_PIPELINING))
- flags &= ~SPOE_APPCTX_FL_PIPELINING;
- if ((flags & SPOE_APPCTX_FL_ASYNC) && !(agent->flags & SPOE_FL_ASYNC))
- flags &= ~SPOE_APPCTX_FL_ASYNC;
+ if (!agent)
+ flags &= ~(SPOE_APPCTX_FL_PIPELINING|SPOE_APPCTX_FL_ASYNC);
+ else {
+ if ((flags & SPOE_APPCTX_FL_PIPELINING) && !(agent->flags & SPOE_FL_PIPELINING))
+ flags &= ~SPOE_APPCTX_FL_PIPELINING;
+ if ((flags & SPOE_APPCTX_FL_ASYNC) && !(agent->flags & SPOE_FL_ASYNC))
+ flags &= ~SPOE_APPCTX_FL_ASYNC;
+ }
SPOE_APPCTX(appctx)->version = (unsigned int)vsn;
SPOE_APPCTX(appctx)->max_frame_size = (unsigned int)max_frame_size;
@@ -2881,6 +2887,7 @@
struct flt_conf *f;
struct spoe_config *conf = fconf->conf;
struct proxy *target;
+ int i;
/* Check all SPOE filters for proxy <px> to be sure all SPOE agent names
* are uniq */
@@ -2918,6 +2925,34 @@
return 1;
}
+ if (px->bind_proc & ~target->bind_proc) {
+ ha_alert("Proxy %s : backend '%s' used by SPOE agent '%s' declared"
+ " at %s:%d does not cover all of its processes.\n",
+ px->id, target->id, conf->agent->id,
+ conf->agent->conf.file, conf->agent->conf.line);
+ return 1;
+ }
+
+ /* finish per-thread agent initialization */
+ if (global.nbthread == 1)
+ conf->agent->flags |= SPOE_FL_ASYNC;
+
+ if ((curagent->rt = calloc(global.nbthread, sizeof(*curagent->rt))) == NULL) {
+ ha_alert("Proxy %s : out of memory initializing SPOE agent '%s' declared at %s:%d.\n",
+ px->id, conf->agent->id, conf->agent->conf.file, conf->agent->conf.line);
+ return 1;
+ }
+ for (i = 0; i < global.nbthread; ++i) {
+ curagent->rt[i].frame_size = curagent->max_frame_size;
+ curagent->rt[i].applets_act = 0;
+ curagent->rt[i].applets_idle = 0;
+ curagent->rt[i].sending_rate = 0;
+ LIST_INIT(&curagent->rt[i].applets);
+ LIST_INIT(&curagent->rt[i].sending_queue);
+ LIST_INIT(&curagent->rt[i].waiting_queue);
+ HA_SPIN_INIT(&curagent->rt[i].lock);
+ }
+
free(conf->agent->b.name);
conf->agent->b.name = NULL;
conf->agent->b.be = target;
@@ -3196,8 +3231,6 @@
curagent->var_pfx = NULL;
curagent->var_on_error = NULL;
curagent->flags = (SPOE_FL_PIPELINING | SPOE_FL_SND_FRAGMENTATION);
- if (global.nbthread == 1)
- curagent->flags |= SPOE_FL_ASYNC;
curagent->cps_max = 0;
curagent->eps_max = 0;
curagent->max_frame_size = MAX_FRAME_SIZE;
@@ -3208,22 +3241,6 @@
LIST_INIT(&curagent->events[i]);
LIST_INIT(&curagent->groups);
LIST_INIT(&curagent->messages);
-
- if ((curagent->rt = calloc(global.nbthread, sizeof(*curagent->rt))) == NULL) {
- ha_alert("parsing [%s:%d] : out of memory.\n", file, linenum);
- err_code |= ERR_ALERT | ERR_ABORT;
- goto out;
- }
- for (i = 0; i < global.nbthread; ++i) {
- curagent->rt[i].frame_size = curagent->max_frame_size;
- curagent->rt[i].applets_act = 0;
- curagent->rt[i].applets_idle = 0;
- curagent->rt[i].sending_rate = 0;
- LIST_INIT(&curagent->rt[i].applets);
- LIST_INIT(&curagent->rt[i].sending_queue);
- LIST_INIT(&curagent->rt[i].waiting_queue);
- HA_SPIN_INIT(&curagent->rt[i].lock);
- }
}
else if (!strcmp(args[0], "use-backend")) {
if (!*args[1]) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/haproxy.c new/haproxy-1.8.19~git0.ebf033b4/src/haproxy.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/haproxy.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/haproxy.c 2019-02-11 14:16:19.000000000 +0100
@@ -2155,6 +2155,7 @@
}
deinit_tcp_rules(&p->tcp_req.inspect_rules);
+ deinit_tcp_rules(&p->tcp_rep.inspect_rules);
deinit_tcp_rules(&p->tcp_req.l4_rules);
deinit_stick_rules(&p->storersp_rules);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/hlua.c new/haproxy-1.8.19~git0.ebf033b4/src/hlua.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/hlua.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/hlua.c 2019-02-11 14:16:19.000000000 +0100
@@ -7984,9 +7984,9 @@
socket_ssl.obj_type = OBJ_TYPE_SERVER;
LIST_INIT(&socket_ssl.actconns);
LIST_INIT(&socket_ssl.pendconns);
- socket_tcp.priv_conns = NULL;
- socket_tcp.idle_conns = NULL;
- socket_tcp.safe_conns = NULL;
+ socket_ssl.priv_conns = NULL;
+ socket_ssl.idle_conns = NULL;
+ socket_ssl.safe_conns = NULL;
socket_ssl.next_state = SRV_ST_RUNNING; /* early server setup */
socket_ssl.last_change = 0;
socket_ssl.id = "LUA-SSL-CONN";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/hpack-dec.c new/haproxy-1.8.19~git0.ebf033b4/src/hpack-dec.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/hpack-dec.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/hpack-dec.c 2019-02-11 14:16:19.000000000 +0100
@@ -213,6 +213,12 @@
ret = -HPACK_ERR_TRUNCATED;
goto leave;
}
+
+ if (idx > dht->size) {
+ hpack_debug_printf("##ERR@%d##\n", __LINE__);
+ ret = -HPACK_ERR_INVALID_ARGUMENT;
+ goto leave;
+ }
continue;
}
else if (!(*raw & (*raw - 0x10))) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/mux_h2.c new/haproxy-1.8.19~git0.ebf033b4/src/mux_h2.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/mux_h2.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/mux_h2.c 2019-02-11 14:16:19.000000000 +0100
@@ -548,12 +548,15 @@
h2c->st0 = H2_CS_ERROR;
}
-/* marks an error on the stream */
+/* marks an error on the stream. It may also update an already closed stream
+ * (e.g. to report an error after an RST was received).
+ */
static inline __maybe_unused void h2s_error(struct h2s *h2s, enum h2_err err)
{
- if (h2s->st > H2_SS_IDLE && h2s->st < H2_SS_ERROR) {
+ if (h2s->id && h2s->st != H2_SS_ERROR) {
h2s->errcode = err;
- h2s->st = H2_SS_ERROR;
+ if (h2s->st < H2_SS_ERROR)
+ h2s->st = H2_SS_ERROR;
if (h2s->cs)
h2s->cs->flags |= CS_FL_ERROR;
}
@@ -1140,6 +1143,14 @@
while (node) {
h2s = container_of(node, struct h2s, by_id);
h2s->mws += diff;
+
+ if (h2s->mws > 0 && (h2s->flags & H2_SF_BLK_SFCTL)) {
+ h2s->flags &= ~H2_SF_BLK_SFCTL;
+ if (h2s->cs && LIST_ISEMPTY(&h2s->list) &&
+ (h2s->cs->flags & CS_FL_DATA_WR_ENA))
+ LIST_ADDQ(&h2c->send_list, &h2s->list);
+ }
+
node = eb32_next(node);
}
}
@@ -1766,7 +1777,11 @@
/* last frame */
if (h2c->dff & H2_F_DATA_END_STREAM) {
- h2s->st = H2_SS_HREM;
+ if (h2s->st == H2_SS_OPEN)
+ h2s->st = H2_SS_HREM;
+ else
+ h2s_close(h2s);
+
h2s->flags |= H2_SF_ES_RCVD;
}
@@ -1891,10 +1906,14 @@
if (h2s->st == H2_SS_HREM && h2c->dft != H2_FT_WINDOW_UPDATE &&
h2c->dft != H2_FT_RST_STREAM && h2c->dft != H2_FT_PRIORITY) {
/* RFC7540#5.1: any frame other than WU/PRIO/RST in
- * this state MUST be treated as a stream error
+ * this state MUST be treated as a stream error.
+ * 6.2, 6.6 and 6.10 further mandate that HEADERS/
+ * PUSH_PROMISE/CONTINUATION cause connection errors.
*/
- h2s_error(h2s, H2_ERR_STREAM_CLOSED);
- h2c->st0 = H2_CS_FRAME_E;
+ if (h2_ft_bit(h2c->dft) & H2_FT_HDR_MASK)
+ h2c_error(h2c, H2_ERR_PROTOCOL_ERROR);
+ else
+ h2s_error(h2s, H2_ERR_STREAM_CLOSED);
goto strm_err;
}
@@ -1910,7 +1929,7 @@
* Some frames have to be silently ignored as well.
*/
if (h2s->st == H2_SS_CLOSED && h2c->dsi) {
- if (h2c->dft == H2_FT_HEADERS || h2c->dft == H2_FT_PUSH_PROMISE) {
+ if (h2_ft_bit(h2c->dft) & H2_FT_HDR_MASK) {
/* #5.1.1: The identifier of a newly
* established stream MUST be numerically
* greater than all streams that the initiating
@@ -1949,7 +1968,7 @@
* over which it ignores frames and treat frames that
* arrive after this time as being in error.
*/
- if (!(h2s->flags & H2_SF_RST_SENT)) {
+ if (h2s->id && !(h2s->flags & H2_SF_RST_SENT)) {
/* RFC7540#5.1:closed: any frame other than
* PRIO/WU/RST in this state MUST be treated as
* a connection error
@@ -2561,7 +2580,6 @@
if (eb_is_empty(&h2c->streams_by_id) && /* don't close if streams exist */
((h2c->conn->flags & CO_FL_ERROR) || /* errors close immediately */
(h2c->st0 >= H2_CS_ERROR && !h2c->task) || /* a timeout stroke earlier */
- (h2c->flags & (H2_CF_GOAWAY_FAILED | H2_CF_GOAWAY_SENT)) ||
(!h2c->mbuf->o && /* mux buffer empty, also process clean events below */
(conn_xprt_read0_pending(h2c->conn) ||
(h2c->last_sid >= 0 && h2c->max_id >= h2c->last_sid))))) {
@@ -2588,11 +2606,17 @@
if (h2s->st == H2_SS_HLOC || h2s->st == H2_SS_ERROR || h2s->st == H2_SS_CLOSED)
return;
- /* if no outgoing data was seen on this stream, it means it was
- * closed with a "tcp-request content" rule that is normally
- * used to kill the connection ASAP (eg: limit abuse). In this
- * case we send a goaway to close the connection.
+ /* a connstream may require us to immediately kill the whole connection
+ * for example because of a "tcp-request content reject" rule that is
+ * normally used to limit abuse. In this case we schedule a goaway to
+ * close the connection.
*/
+ if ((h2s->cs->flags & CS_FL_KILL_CONN) &&
+ !(h2s->h2c->flags & (H2_CF_GOAWAY_SENT|H2_CF_GOAWAY_FAILED))) {
+ h2c_error(h2s->h2c, H2_ERR_ENHANCE_YOUR_CALM);
+ h2s_error(h2s, H2_ERR_ENHANCE_YOUR_CALM);
+ }
+
if (!(h2s->flags & H2_SF_RST_SENT) &&
h2s_send_rst_stream(h2s->h2c, h2s) <= 0)
goto add_to_list;
@@ -2635,11 +2659,17 @@
else
h2s->st = H2_SS_HLOC;
} else {
- /* if no outgoing data was seen on this stream, it means it was
- * closed with a "tcp-request content" rule that is normally
- * used to kill the connection ASAP (eg: limit abuse). In this
- * case we send a goaway to close the connection.
+ /* a connstream may require us to immediately kill the whole connection
+ * for example because of a "tcp-request content reject" rule that is
+ * normally used to limit abuse. In this case we schedule a goaway to
+ * close the connection.
*/
+ if ((h2s->cs->flags & CS_FL_KILL_CONN) &&
+ !(h2s->h2c->flags & (H2_CF_GOAWAY_SENT|H2_CF_GOAWAY_FAILED))) {
+ h2c_error(h2s->h2c, H2_ERR_ENHANCE_YOUR_CALM);
+ h2s_error(h2s, H2_ERR_ENHANCE_YOUR_CALM);
+ }
+
if (!(h2s->flags & H2_SF_RST_SENT) &&
h2s_send_rst_stream(h2s->h2c, h2s) <= 0)
goto add_to_list;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/proto_http.c new/haproxy-1.8.19~git0.ebf033b4/src/proto_http.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/proto_http.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/proto_http.c 2019-02-11 14:16:19.000000000 +0100
@@ -3935,7 +3935,8 @@
* that parameter. This will be done in another analyser.
*/
if (!(s->flags & (SF_ASSIGNED|SF_DIRECT)) &&
- s->txn->meth == HTTP_METH_POST && s->be->url_param_name != NULL &&
+ s->txn->meth == HTTP_METH_POST &&
+ (s->be->lbprm.algo & BE_LB_ALGO) == BE_LB_ALGO_PH &&
(msg->flags & (HTTP_MSGF_CNT_LEN|HTTP_MSGF_TE_CHNK))) {
channel_dont_connect(req);
req->analysers |= AN_REQ_HTTP_BODY;
@@ -8210,6 +8211,7 @@
txn->flags = 0;
txn->status = -1;
+ *(unsigned int *)txn->cache_hash = 0;
txn->cookie_first_date = 0;
txn->cookie_last_date = 0;
@@ -12106,6 +12108,7 @@
enum act_return http_action_reject(struct act_rule *rule, struct proxy *px,
struct session *sess, struct stream *s, int flags)
{
+ si_must_kill_conn(chn_prod(&s->req));
channel_abort(&s->req);
channel_abort(&s->res);
s->req.analysers = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/sample.c new/haproxy-1.8.19~git0.ebf033b4/src/sample.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/sample.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/sample.c 2019-02-11 14:16:19.000000000 +0100
@@ -1261,6 +1261,13 @@
break;
}
+ if (p->bind_proc & ~px->bind_proc) {
+ ha_alert("parsing [%s:%d] : stick-table '%s' not present on all processes covered by proxy '%s'.\n",
+ cur->file, cur->line, px->id, p->id);
+ cfgerr++;
+ break;
+ }
+
free(arg->data.str.str);
arg->data.str.str = NULL;
arg->unresolved = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/server.c new/haproxy-1.8.19~git0.ebf033b4/src/server.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/server.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/server.c 2019-02-11 14:16:19.000000000 +0100
@@ -1534,7 +1534,6 @@
static struct server *new_server(struct proxy *proxy)
{
struct server *srv;
- int i;
srv = calloc(1, sizeof *srv);
if (!srv)
@@ -1545,21 +1544,6 @@
LIST_INIT(&srv->actconns);
LIST_INIT(&srv->pendconns);
- if ((srv->priv_conns = calloc(global.nbthread, sizeof(*srv->priv_conns))) == NULL)
- goto free_srv;
- if ((srv->idle_conns = calloc(global.nbthread, sizeof(*srv->idle_conns))) == NULL)
- goto free_priv_conns;
- if ((srv->safe_conns = calloc(global.nbthread, sizeof(*srv->safe_conns))) == NULL)
- goto free_idle_conns;
-
- for (i = 0; i < global.nbthread; i++) {
- LIST_INIT(&srv->priv_conns[i]);
- LIST_INIT(&srv->idle_conns[i]);
- LIST_INIT(&srv->safe_conns[i]);
- }
-
- LIST_INIT(&srv->update_status);
-
srv->next_state = SRV_ST_RUNNING; /* early server setup */
srv->last_change = now.tv_sec;
@@ -1572,14 +1556,6 @@
srv->xprt = srv->check.xprt = srv->agent.xprt = xprt_get(XPRT_RAW);
return srv;
-
- free_idle_conns:
- free(srv->idle_conns);
- free_priv_conns:
- free(srv->priv_conns);
- free_srv:
- free(srv);
- return NULL;
}
/*
@@ -2843,16 +2819,37 @@
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
/* recover operational state and apply it to this server
* and all servers tracking this one */
+ srv->check.health = srv_check_health;
switch (srv_op_state) {
case SRV_ST_STOPPED:
srv->check.health = 0;
srv_set_stopped(srv, "changed from server-state after a reload", NULL);
break;
case SRV_ST_STARTING:
+ /* If rise == 1 there is no STARTING state, let's switch to
+ * RUNNING
+ */
+ if (srv->check.rise == 1) {
+ srv->check.health = srv->check.rise + srv->check.fall - 1;
+ srv_set_running(srv, "", NULL);
+ break;
+ }
+ if (srv->check.health < 1 || srv->check.health >= srv->check.rise)
+ srv->check.health = srv->check.rise - 1;
srv->next_state = srv_op_state;
break;
case SRV_ST_STOPPING:
- srv->check.health = srv->check.rise + srv->check.fall - 1;
+ /* If fall == 1 there is no STOPPING state, let's switch to
+ * STOPPED
+ */
+ if (srv->check.fall == 1) {
+ srv->check.health = 0;
+ srv_set_stopped(srv, "changed from server-state after a reload", NULL);
+ break;
+ }
+ if (srv->check.health < srv->check.rise ||
+ srv->check.health > srv->check.rise + srv->check.fall - 2)
+ srv->check.health = srv->check.rise;
srv_set_stopping(srv, "changed from server-state after a reload", NULL);
break;
case SRV_ST_RUNNING:
@@ -2906,7 +2903,6 @@
srv->last_change = date.tv_sec - srv_last_time_change;
srv->check.status = srv_check_status;
srv->check.result = srv_check_result;
- srv->check.health = srv_check_health;
/* Only case we want to apply is removing ENABLED flag which could have been
* done by the "disable health" command over the stats socket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/ssl_sock.c new/haproxy-1.8.19~git0.ebf033b4/src/ssl_sock.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/ssl_sock.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/ssl_sock.c 2019-02-11 14:16:19.000000000 +0100
@@ -1406,6 +1406,10 @@
BIO *write_bio;
(void)ret; /* shut gcc stupid warning */
+#ifndef SSL_OP_NO_RENEGOTIATION
+ /* Please note that BoringSSL defines this macro to zero so don't
+ * change this to #if and do not assign a default value to this macro!
+ */
if (where & SSL_CB_HANDSHAKE_START) {
/* Disable renegotiation (CVE-2009-3555) */
if ((conn->flags & (CO_FL_CONNECTED | CO_FL_EARLY_SSL_HS | CO_FL_EARLY_DATA)) == CO_FL_CONNECTED) {
@@ -1413,6 +1417,7 @@
conn->err_code = CO_ER_SSL_RENEG;
}
}
+#endif
if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) {
if (!(conn->xprt_st & SSL_SOCK_ST_FL_16K_WBFSIZE)) {
@@ -3806,6 +3811,11 @@
options |= SSL_OP_NO_TICKET;
if (bind_conf->ssl_options & BC_SSL_O_PREF_CLIE_CIPH)
options &= ~SSL_OP_CIPHER_SERVER_PREFERENCE;
+
+#ifdef SSL_OP_NO_RENEGOTIATION
+ options |= SSL_OP_NO_RENEGOTIATION;
+#endif
+
SSL_CTX_set_options(ctx, options);
#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL) && !defined(OPENSSL_NO_ASYNC)
@@ -3821,6 +3831,10 @@
SSL_CTX_set_select_certificate_cb(ctx, ssl_sock_switchctx_cbk);
SSL_CTX_set_tlsext_servername_callback(ctx, ssl_sock_switchctx_err_cbk);
#elif (OPENSSL_VERSION_NUMBER >= 0x10101000L)
+ if (bind_conf->ssl_conf.early_data) {
+ SSL_CTX_set_options(ctx, SSL_OP_NO_ANTI_REPLAY);
+ SSL_CTX_set_max_early_data(ctx, global.tune.bufsize - global.tune.maxrewrite);
+ }
SSL_CTX_set_client_hello_cb(ctx, ssl_sock_switchctx_cbk, NULL);
SSL_CTX_set_tlsext_servername_callback(ctx, ssl_sock_switchctx_err_cbk);
#else
@@ -7623,15 +7637,36 @@
}
keys_ref = malloc(sizeof(*keys_ref));
+ if (!keys_ref) {
+ if (err)
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
+ return ERR_ALERT | ERR_FATAL;
+ }
+
keys_ref->tlskeys = malloc(TLS_TICKETS_NO * sizeof(struct tls_sess_key));
+ if (!keys_ref->tlskeys) {
+ free(keys_ref);
+ if (err)
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
+ return ERR_ALERT | ERR_FATAL;
+ }
if ((f = fopen(args[cur_arg + 1], "r")) == NULL) {
+ free(keys_ref->tlskeys);
+ free(keys_ref);
if (err)
memprintf(err, "'%s' : unable to load ssl tickets keys file", args[cur_arg+1]);
return ERR_ALERT | ERR_FATAL;
}
keys_ref->filename = strdup(args[cur_arg + 1]);
+ if (!keys_ref->filename) {
+ free(keys_ref->tlskeys);
+ free(keys_ref);
+ if (err)
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
+ return ERR_ALERT | ERR_FATAL;
+ }
while (fgets(thisline, sizeof(thisline), f) != NULL) {
int len = strlen(thisline);
@@ -7643,6 +7678,9 @@
thisline[--len] = 0;
if (base64dec(thisline, len, (char *) (keys_ref->tlskeys + i % TLS_TICKETS_NO), sizeof(struct tls_sess_key)) != sizeof(struct tls_sess_key)) {
+ free(keys_ref->filename);
+ free(keys_ref->tlskeys);
+ free(keys_ref);
if (err)
memprintf(err, "'%s' : unable to decode base64 key on line %d", args[cur_arg+1], i + 1);
fclose(f);
@@ -7652,6 +7690,9 @@
}
if (i < TLS_TICKETS_NO) {
+ free(keys_ref->filename);
+ free(keys_ref->tlskeys);
+ free(keys_ref);
if (err)
memprintf(err, "'%s' : please supply at least %d keys in the tls-tickets-file", args[cur_arg+1], TLS_TICKETS_NO);
fclose(f);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/stream.c new/haproxy-1.8.19~git0.ebf033b4/src/stream.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/stream.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/stream.c 2019-02-11 14:16:19.000000000 +0100
@@ -339,6 +339,9 @@
offer_buffers(NULL, tasks_run_queue + applets_active_queue);
}
+ pool_free(pool_head_uniqueid, s->unique_id);
+ s->unique_id = NULL;
+
hlua_ctx_destroy(s->hlua);
s->hlua = NULL;
if (s->txn)
@@ -593,7 +596,8 @@
*/
si->state = SI_ST_EST;
si->err_type = SI_ET_DATA_ERR;
- rep->flags |= CF_READ_ERROR | CF_WRITE_ERROR;
+ req->flags |= CF_WRITE_ERROR;
+ rep->flags |= CF_READ_ERROR;
return 1;
}
si->exp = TICK_ETERNITY;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/stream_interface.c new/haproxy-1.8.19~git0.ebf033b4/src/stream_interface.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/stream_interface.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/stream_interface.c 2019-02-11 14:16:19.000000000 +0100
@@ -830,6 +830,9 @@
if (si->state != SI_ST_EST && si->state != SI_ST_CON)
return;
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
+
if (si_oc(si)->flags & CF_SHUTW) {
cs_close(cs);
si->state = SI_ST_DIS;
@@ -880,6 +883,9 @@
* However, if SI_FL_NOLINGER is explicitly set, we know there is
* no risk so we close both sides immediately.
*/
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
+
if (si->flags & SI_FL_ERR) {
/* quick close, the socket is alredy shut anyway */
}
@@ -914,6 +920,8 @@
/* we may have to close a pending connection, and mark the
* response buffer as shutr
*/
+ if (si->flags & SI_FL_KILL_CONN)
+ cs->flags |= CS_FL_KILL_CONN;
cs_close(cs);
/* fall through */
case SI_ST_CER:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/haproxy-1.8.17~git0.e89d25b2/src/tcp_rules.c new/haproxy-1.8.19~git0.ebf033b4/src/tcp_rules.c
--- old/haproxy-1.8.17~git0.e89d25b2/src/tcp_rules.c 2019-01-08 14:11:02.000000000 +0100
+++ new/haproxy-1.8.19~git0.ebf033b4/src/tcp_rules.c 2019-02-11 14:16:19.000000000 +0100
@@ -162,6 +162,7 @@
break;
}
else if (rule->action == ACT_ACTION_DENY) {
+ si_must_kill_conn(chn_prod(req));
channel_abort(req);
channel_abort(&s->res);
req->analysers = 0;
@@ -340,6 +341,7 @@
break;
}
else if (rule->action == ACT_ACTION_DENY) {
+ si_must_kill_conn(chn_prod(rep));
channel_abort(rep);
channel_abort(&s->req);
rep->analysers = 0;
@@ -357,6 +359,7 @@
}
else if (rule->action == ACT_TCP_CLOSE) {
chn_prod(rep)->flags |= SI_FL_NOLINGER | SI_FL_NOHALF;
+ si_must_kill_conn(chn_prod(rep));
si_shutr(chn_prod(rep));
si_shutw(chn_prod(rep));
break;