]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
9 years agoBUG/MAJOR: lua: segfault after the channel data is modified by some Lua action.
Thierry FOURNIER [Fri, 25 Sep 2015 17:22:44 +0000 (19:22 +0200)] 
BUG/MAJOR: lua: segfault after the channel data is modified by some Lua action.

When an action or a fetch modify the channel data, the http request parser
pointer become inconsistent. This patch detects the modification and call
again the parser.

9 years agoMEDIUM: lua: use the function lua_rawset in place of lua_settable
Thierry FOURNIER [Fri, 25 Sep 2015 20:13:32 +0000 (22:13 +0200)] 
MEDIUM: lua: use the function lua_rawset in place of lua_settable

The function lua_settable uses the metatable for acessing data,
so in the C part, we want to index value in the real table and
not throught the meta-methods. It's much faster this way.

9 years agoMINOR: lua: identify userdata objects
Thierry FOURNIER [Fri, 18 Sep 2015 05:35:06 +0000 (07:35 +0200)] 
MINOR: lua: identify userdata objects

This patch adds lua primitives for identifying lua class
associated with userdata.

9 years agoMINOR: lua: reset pointer after use
Thierry FOURNIER [Mon, 21 Sep 2015 20:50:24 +0000 (22:50 +0200)] 
MINOR: lua: reset pointer after use

After releasing the Lua environment, this patch set the only one pointer to
the Lua stack to NULL. This prevents an accidental re-use.

9 years agoMINOR: http: split initialization
Thierry FOURNIER [Fri, 25 Sep 2015 16:53:18 +0000 (18:53 +0200)] 
MINOR: http: split initialization

The goal is to export the http txn initialisation functions for
using it in the Lua code.

9 years agoMINOR: http: export function http_msg_analyzer()
Thierry FOURNIER [Fri, 25 Sep 2015 09:06:37 +0000 (11:06 +0200)] 
MINOR: http: export function http_msg_analyzer()

Exports the function http_msg_analyzer().

9 years agoMINOR: http: export the get_reason() function
Thierry FOURNIER [Fri, 18 Sep 2015 15:59:23 +0000 (17:59 +0200)] 
MINOR: http: export the get_reason() function

This patch exports the get_reason() function.

9 years agoMINOR: http: export http_get_path() function
Thierry FOURNIER [Thu, 17 Sep 2015 17:33:35 +0000 (19:33 +0200)] 
MINOR: http: export http_get_path() function

This patch simply exports the http_get_path() function from the proto_http.c file.

9 years agoCLEANUP: lua: align defines
Thierry FOURNIER [Wed, 16 Sep 2015 19:22:28 +0000 (21:22 +0200)] 
CLEANUP: lua: align defines

Align the defined values

9 years agoMINOR: channel: rename function chn_sess to chn_strm
Thierry FOURNIER [Fri, 25 Sep 2015 06:36:11 +0000 (08:36 +0200)] 
MINOR: channel: rename function chn_sess to chn_strm

The name of the function chn_sess is no longer appropriate.
This patch renames it to chn_strm.

9 years agoMEDIUM: proto_http: smp_prefetch_http initialize txn
Thierry FOURNIER [Thu, 24 Sep 2015 06:40:18 +0000 (08:40 +0200)] 
MEDIUM: proto_http: smp_prefetch_http initialize txn

When we call the function smp_prefetch_http(), if the txn is not initialized,
it doesn't work. This patch fix this. Now, smp_prefecth_http() permits to use
http with any proxy mode.

9 years agoBUG/MEDIUM: stream-int: avoid double-call to applet->release
Willy Tarreau [Fri, 25 Sep 2015 18:24:26 +0000 (20:24 +0200)] 
BUG/MEDIUM: stream-int: avoid double-call to applet->release

While the SI_ST_DIS state is set *after* doing the close on a connection,
it was set *before* calling release on an applet. Applets have no internal
flags contrary to connections, so they have no way to detect they were
already released. Because of this it happened that applets were closed
twice, once via si_applet_release() and once via si_release_endpoint() at
the end of a transaction. The CLI applet could perform a double free in
this case, though the situation to cause it is quite hard because it
requires that the applet is stuck on output in states that produce very
few data.

In order to solve this, we now assign the SI_ST_DIS state *after* calling
->release, and we refrain from doing so if the state is already assigned.
This makes applets work much more like connections and definitely avoids
this double release.

In the future it might be worth making applets have their own flags like
connections to carry their own state regardless of the stream interface's
state, especially when dealing with connection reuse.

No backport is needed since this issue was caused by the rearchitecture
in 1.6.

9 years agoMINOR: cli: do not call the release handler on internal error.
Willy Tarreau [Fri, 25 Sep 2015 18:08:51 +0000 (20:08 +0200)] 
MINOR: cli: do not call the release handler on internal error.

It's dangerous to call this on internal state error, because it risks
to perform a double-free. This can only happen when a state is not
handled. Note that the switch/case currently doesn't offer any option
for missed states since they're all declared. Better fix this anyway.
The fix was tested by commenting out some entries in the switch/case.

9 years agoBUG/MEDIUM: cli: properly handle closed output
Willy Tarreau [Fri, 25 Sep 2015 18:06:08 +0000 (20:06 +0200)] 
BUG/MEDIUM: cli: properly handle closed output

Due to the code inherited from the early CLI mode with the non-interactive
code, the SHUTR status was only considered while waiting for a request,
which prevents the connection from properly being closed during a dump,
and the connection used to remain established. This issue didn't happen
in 1.5 because while this part was missed, the resynchronization performed
in process_session() would detect the situation and handle the cleanup.

No backport is needed.

9 years agoBUG/MINOR: stats: do not call cli_release_handler 3 times
Willy Tarreau [Fri, 25 Sep 2015 17:21:19 +0000 (19:21 +0200)] 
BUG/MINOR: stats: do not call cli_release_handler 3 times

If an error happens during a dump on the CLI, an explicit call to
cli_release_handler() is performed. This is not needed anymore since
we introduced ->release() in the applet which is called upon error.
Let's remove this confusing call which can even be risky in some
situations.

9 years agoBUG/MEDIUM: applet: fix reporting of broken write situation
Willy Tarreau [Fri, 25 Sep 2015 17:11:55 +0000 (19:11 +0200)] 
BUG/MEDIUM: applet: fix reporting of broken write situation

If an applet tries to write to a closed connection, it hangs forever.
This results in some "get map" commands on the CLI to leave orphaned
connections alive.

Now the applet wakeup function detects that the applet still wants to
write while the channel is closed for reads, which is the equivalent
to the common "broken pipe" situation. In this case, an error is
reported on the stream interface, just as it happens with connections
trying to perform a send() in a similar situation.

With this fix the stats socket is properly released.

9 years agoMINOR: stream-int: rename si_applet_done() to si_applet_wake_cb()
Willy Tarreau [Fri, 25 Sep 2015 09:45:06 +0000 (11:45 +0200)] 
MINOR: stream-int: rename si_applet_done() to si_applet_wake_cb()

This function is a callback made only for calls from the applet handler.
Rename it to remove confusion. It's currently called from the Lua code
but that's not correct, we should call the notify and update functions
instead otherwise it will not enable the applet again.

9 years agoMEDIUM: stream-int: completely remove stream_int_update_embedded()
Willy Tarreau [Thu, 24 Sep 2015 16:05:45 +0000 (18:05 +0200)] 
MEDIUM: stream-int: completely remove stream_int_update_embedded()

This one is not needed anymore as what it used to do is either
completely covered by the new stream_int_notify() function, or undesired
and inherited from the past as a side effect of introducing the
connections.

This update is theorically never called since it's assigned only when
nothing is connected to the stream interface. However a test has been
added to si_update() to stay safe if some foreign code decides to call
si_update() in unsafe situations.

9 years agoMEDIUM: stream-int: use the same stream notification function for applets and conns
Willy Tarreau [Wed, 23 Sep 2015 18:06:13 +0000 (20:06 +0200)] 
MEDIUM: stream-int: use the same stream notification function for applets and conns

The code to report completion after a connection update or an applet update
was almost the same since applets stole it from the connection. But the
differences made them hard to maintain and prevented the creation of new
functions doing only one part of the work.

This patch replaces the common code from the si_conn_wake_cb() and
si_applet_wake_cb() with a single call to stream_int_notify() which only
notifies the stream (si+channels+task) from the outside.

No functional change was made beyond this.

9 years agoMINOR: stream-int: implement the stream_int_notify() function
Willy Tarreau [Wed, 23 Sep 2015 16:40:09 +0000 (18:40 +0200)] 
MINOR: stream-int: implement the stream_int_notify() function

stream_int_notify() was taken from the common part between si_conn_wake_cb()
and si_applet_done(). It is designed to report activity to a stream from
outside its handler. It'll generally be used by lower layers to report I/O
completion but may also be used by remote streams if the buffer processing
is shared.

9 years agoMEDIUM: stream-int: clean up the conditions to enable reading in si_conn_wake_cb
Willy Tarreau [Wed, 23 Sep 2015 17:37:00 +0000 (19:37 +0200)] 
MEDIUM: stream-int: clean up the conditions to enable reading in si_conn_wake_cb

The condition to release the SI_FL_WAIT_ROOM flag was abnormally
complicated because it was inherited from 6 years ago before we used
to check for the buffer's emptiness. The CF_READ_PARTIAL flag had to be
removed, and the complex test was replaced with a simpler one checking
if *some* data were moved out or not.

The reason behind this change is to have a condition compatible with
both connections and applets, as applets currently don't work very
well in this area. Specifically, some optimizations on the applet
side cause them not to release the flag above until the buffer is
empty, which may prevent applets from taking together (eg: peers
over large haproxy buffers and small kernel buffers).

9 years agoMINOR: stream-int: move the applet_pause call out of the stream updates
Willy Tarreau [Wed, 23 Sep 2015 17:55:42 +0000 (19:55 +0200)] 
MINOR: stream-int: move the applet_pause call out of the stream updates

It's just to split the part dealing with the stream update and the part
dealing with the applet update in si_applet_done().

9 years agoMINOR: stream-int: export stream_int_update_*
Willy Tarreau [Fri, 25 Sep 2015 09:01:42 +0000 (11:01 +0200)] 
MINOR: stream-int: export stream_int_update_*

Not only these functions were not static, but we'll also want to export
them.

9 years agoMEDIUM: stream-int: call stream_int_update() from si_update()
Willy Tarreau [Fri, 25 Sep 2015 08:59:38 +0000 (10:59 +0200)] 
MEDIUM: stream-int: call stream_int_update() from si_update()

Now the call to stream_int_update() is moved to si_update(), which
is exclusively called from the stream, so that the socket layer may
be updated without updating the stream layer. This will later permit
to call it individually from other places (other tasks or applets for
example).

9 years agoMEDIUM: stream-int: factor out the stream update functions
Willy Tarreau [Fri, 25 Sep 2015 08:39:16 +0000 (10:39 +0200)] 
MEDIUM: stream-int: factor out the stream update functions

Now that we have a generic stream_int_update() function, we can
replace the equivalent part in stream_int_update_conn() and
stream_int_update_applet() to avoid code duplication.

There is no functional change, as the code is the same but split
in two functions for each call.

9 years agoMINOR: stream-int: implement a new stream_int_update() function
Willy Tarreau [Thu, 24 Sep 2015 09:32:22 +0000 (11:32 +0200)] 
MINOR: stream-int: implement a new stream_int_update() function

This function is designed to be called from within the stream handler to
update the channels' expiration timers and the stream interface's flags
based on the channels' flags. It needs to be called only once after the
channels' flags have settled down, and before they are cleared, though it
doesn't harm to call it as often as desired (it just slightly hurts
performance). It must not be called from outside of the stream handler,
as what it does will be used to compute the stream task's expiration.

The code was taken directly from stream_int_update_applet() and
stream_int_update_conn() which had exactly the same one except for
applet-specific or connection-specific status update.

9 years agoMEDIUM: stream-int: split stream_int_update_conn() into si- and conn-specific parts
Willy Tarreau [Fri, 25 Sep 2015 08:50:59 +0000 (10:50 +0200)] 
MEDIUM: stream-int: split stream_int_update_conn() into si- and conn-specific parts

The purpose is to separate the connection-specific parts so that the
stream-int specific one can be factored out. There's no functional
change here, only code displacement.

9 years agoBUG/MAJOR: applet: use a separate run queue to maintain list integrity
Willy Tarreau [Fri, 25 Sep 2015 15:56:16 +0000 (17:56 +0200)] 
BUG/MAJOR: applet: use a separate run queue to maintain list integrity

If an applet wakes up and causes the next one to sleep, the active list
is corrupted and cannot be scanned anymore, as the process then loops
over the next element.

In order to avoid this problem, we move the active applet list to a run
queue and reinit the active list. Only the first element of this queue
is checked, and if the element is not removed, it is removed and requeued
into the active list.

Since we're using a distinct list, if an applet wants to requeue another
applet into the active list, it properly gets added to the active list
and not to the run queue.

This stops the infinite loop issue that could be caused with Lua applets,
and in any future configuration where two applets could be attached
together.

9 years agoMINOR: applet: rename applet_runq to applet_active_queue
Willy Tarreau [Fri, 25 Sep 2015 15:39:23 +0000 (17:39 +0200)] 
MINOR: applet: rename applet_runq to applet_active_queue

This is not a real run queue and we're facing ugly bugs because
if this : if a an applet removes another applet from the queue,
typically the next one after itself, the list iterator loops
forever because the list's backup pointer is not valid anymore.
Before creating a run queue, let's rename this list.

9 years agoBUG/MEDIUM: acl: always accept match "found"
Willy Tarreau [Thu, 24 Sep 2015 14:37:12 +0000 (16:37 +0200)] 
BUG/MEDIUM: acl: always accept match "found"

The pattern match "found" fails to parse on binary type samples. The
reason is that it presents itself as an integer type which bin cannot
be cast into. We must always accept this match since it validates
anything on input regardless of the type. Let's just relax the parser
to accept it.

This problem might also exist in 1.5.
(cherry picked from commit 91cc2368a73198bddc3e140d267cce4ee08cf20e)

9 years agoBUG/MEDIUM: payload: make req.payload and payload_lv aware of dynamic buffers
Willy Tarreau [Thu, 24 Sep 2015 14:33:10 +0000 (16:33 +0200)] 
BUG/MEDIUM: payload: make req.payload and payload_lv aware of dynamic buffers

Due to a check between offset+len and buf->size, an empty buffer returns
"will never match". Check against tune.bufsize instead.
(cherry picked from commit 43e4039fd5d208fd9d32157d20de93d3ddf9bc0d)

9 years agoMINOR: stream-int: use si_release_endpoint() to close idle conns
Willy Tarreau [Wed, 23 Sep 2015 15:56:02 +0000 (17:56 +0200)] 
MINOR: stream-int: use si_release_endpoint() to close idle conns

We don't want to open-code the connection close code in
si_idle_conn_wake_cb() because we need to centralize some controls.

9 years agoMINOR: lua: change actions registration
Thierry FOURNIER [Wed, 23 Sep 2015 19:03:35 +0000 (21:03 +0200)] 
MINOR: lua: change actions registration

The current Lua action are not registered. The executed function is
selected according with a function name writed in the HAProxy configuration.

This patch add an action registration function. The configuration mode
described above disappear.

This change make some incompatibilities with existing configuration files for
HAProxy 1.6-dev.

9 years agoMINOR: action: add reference to the original keywork matched for the called parser.
Thierry FOURNIER [Tue, 22 Sep 2015 17:14:35 +0000 (19:14 +0200)] 
MINOR: action: add reference to the original keywork matched for the called parser.

This is usefull because the keyword can contains some condifiguration
data set while the keyword registration.

9 years agoMINOR: action: add private configuration
Thierry FOURNIER [Tue, 22 Sep 2015 16:26:42 +0000 (18:26 +0200)] 
MINOR: action: add private configuration

This private configuration pointer is used for storing some configuration
data associated the keyword, So many keywords can use the same parse
function, and this one can use a discriminator.

9 years agoBUG/MEDIUM: stream: do not dereference strm_li(stream)
Willy Tarreau [Wed, 23 Sep 2015 10:21:21 +0000 (12:21 +0200)] 
BUG/MEDIUM: stream: do not dereference strm_li(stream)

Some streams do not have a listener (eg: Lua's cosockets) so
let's check for this. For now this problem cannot happen but
it's definitely unsafe.

9 years agoBUG/MEDIUM: proxy: do not dereference strm_li(stream)
Willy Tarreau [Wed, 23 Sep 2015 10:20:10 +0000 (12:20 +0200)] 
BUG/MEDIUM: proxy: do not dereference strm_li(stream)

Some streams do not have a listener (eg: Lua's cosockets) so
let's check for this. For now this problem cannot happen but
it's definitely unsafe.

9 years agoBUG/MEDIUM: http: do not dereference strm_li(stream)
Willy Tarreau [Wed, 23 Sep 2015 10:18:14 +0000 (12:18 +0200)] 
BUG/MEDIUM: http: do not dereference strm_li(stream)

Some streams do not have a listener (eg: Lua's cosockets) so
let's check for this. For now this problem cannot happen but
it's definitely unsafe.

9 years agoBUG/MAJOR: cli: do not dereference strm_li()->proto->name
Willy Tarreau [Wed, 23 Sep 2015 10:16:43 +0000 (12:16 +0200)] 
BUG/MAJOR: cli: do not dereference strm_li()->proto->name

Or it will crash when dumping streams instanciated by an applet,
like Lua's cosockets.

9 years agoCLEANUP: stream-int: remove obsolete function si_applet_call()
Willy Tarreau [Wed, 23 Sep 2015 08:12:49 +0000 (10:12 +0200)] 
CLEANUP: stream-int: remove obsolete function si_applet_call()

This one is not used anymore and is bogus due to the way applets
now work. Remove it instead of fixing it before someone finds it
fun to use it.

9 years agoDOC: add more entries to MAINTAINERS
Willy Tarreau [Wed, 23 Sep 2015 05:41:56 +0000 (07:41 +0200)] 
DOC: add more entries to MAINTAINERS

Simon is willing to maintain mailers and external checks.

9 years agoBUG/MINOR: fct peer_prepare_ackmsg should not use trash.
Emeric Brun [Tue, 22 Sep 2015 13:50:18 +0000 (15:50 +0200)] 
BUG/MINOR: fct peer_prepare_ackmsg should not use trash.

function 'peer_prepare_ackmsg' is designed to use the argument 'msg'
instead of 'trash.str'.

There is currently no bug because the caller passes 'trash.str' in
the 'msg' argument.

9 years agoBUG/MEDIUM: peers: same table updates re-pushed after a re-connect
Emeric Brun [Tue, 22 Sep 2015 13:34:19 +0000 (15:34 +0200)] 
BUG/MEDIUM: peers: same table updates re-pushed after a re-connect

Some updates are pushed using an incremental update message after a
re-connection whereas the origin is forgotten by the peer.
These updates are never correctly acknowledged. So they are regularly
re-pushed after an idle timeout and a re-connect.

The fix consists to use an absolute update message in some cases.

9 years agoBUG/MEDIUM: peers: some table updates are randomly not pushed.
Emeric Brun [Tue, 22 Sep 2015 13:05:06 +0000 (15:05 +0200)] 
BUG/MEDIUM: peers: some table updates are randomly not pushed.

If an entry is still not present in the update tree, we could miss to schedule
for a push depending of an un-initialized value (upd.key remains un-initialized
for new sessions or isn't re-initalized for reused ones).

In the same way, if an entry is present in the tree, but its update's tick
is far in the past (> 2^31). We could consider it's still scheduled even if
it is not the case.

The fix consist to force the re-scheduling of an update if it was not present in
the updates tree or if the update is not in the scheduling window of every peers.

9 years agoBUG: dns: can't connect UDP socket on FreeBSD
Baptiste Assmann [Mon, 21 Sep 2015 18:55:08 +0000 (20:55 +0200)] 
BUG: dns: can't connect UDP socket on FreeBSD

PiBANL reported that HAProxy's DNS resolver can't "connect" its socker
on FreeBSD.
Remi Gacogne reported that we should use the function 'get_addr_len' to
get the addr structure size instead of sizeof.

9 years agoDOC: add more entries to MAINTAINERS
Willy Tarreau [Mon, 21 Sep 2015 23:07:00 +0000 (01:07 +0200)] 
DOC: add more entries to MAINTAINERS

Cyril is the most impacted by doc format changes, Thierry is the one who
knows maps and patterns infrastructure in great details.

9 years agoBUG/MINOR: args: add name for ARGT_VAR
Willy Tarreau [Mon, 21 Sep 2015 18:57:12 +0000 (20:57 +0200)] 
BUG/MINOR: args: add name for ARGT_VAR

Commit 4834bc7 ("MEDIUM: vars: adds support of variables") introduced
ARGT_VAR but forgot to put it in the names array. No backport needed.

9 years agoBUG/MEDIUM: stick-tables: fix double-decrement of tracked entries
Willy Tarreau [Mon, 21 Sep 2015 15:48:24 +0000 (17:48 +0200)] 
BUG/MEDIUM: stick-tables: fix double-decrement of tracked entries

Mailing list participant "mlist" reported negative conn_cur values in
stick tables as the result of "tcp-request connection track-sc". The
reason is that after the stick entry it copied from the session to the
stream, both the session and the stream grab a reference to the entry
and when the stream ends, it decrements one reference and one connection,
then the same is done for the session.

In fact this problem was already encountered slightly differently in the
past and addressed by Thierry using the patch below as it was believed by
then to be only a refcount issue since it was the observable symptom :

   827752e "BUG/MEDIUM: stick-tables: refcount error after copying SC..."

In reality the problem is that the stream must touch neither the refcount
nor the connection count for entries it inherits from the session. While
we have no way to tell whether a track entry was inherited from the session
(since they're simply memcpy'd), it is possible to prevent the stream from
touching an entry that already exists in the session because that's a
guarantee that it was inherited from it.

Note that it may be a temporary fix. Maybe in the future when a session
gives birth to multiple streams we'll face a situation where a session may
be updated to add more tracked entries after instanciating some streams.
The correct long-term fix is to mark some tracked entries as shared or
private (or RO/RW). That will allow the session to track more entries
even after the same trackers are being used by early streams.

No backport is needed, this is only caused by the session/stream split in 1.6.

9 years agoDOC: update coding-style to reference checkpatch.pl
Willy Tarreau [Mon, 21 Sep 2015 14:36:15 +0000 (16:36 +0200)] 
DOC: update coding-style to reference checkpatch.pl

Running the Linux kernel's checkpatch.pl is actually quite efficient
at spotting style issues and even sometimes bugs. The doc now suggests
how to use it to avoid the warnings that are specific to Linux's stricter
rules.

It properly reports errors like the following ones that were found on
real submissions so it should improve the situation for everyone :

ERROR: "foo * bar" should be "foo *bar"
+static char * tcpcheck_get_step_comment(struct check *, int);

ERROR: do not use assignment in if condition
+                       if ((comment = tcpcheck_get_step_comment(check, step)))

WARNING: trailing semicolon indicates no statements, indent implies otherwise
+                       if (elem->data && elem->free);
+                               elem->free(elem->data);

ERROR: do not initialise statics to 0 or NULL
+static struct lru64_head *ssl_ctx_lru_tree = NULL;

ERROR: space required after that ',' (ctx:VxV)
+           !X509_gmtime_adj(X509_get_notAfter(newcrt),(long)60*60*24*365))
                                                      ^
WARNING: space prohibited between function name and open parenthesis '('
+       else if (EVP_PKEY_type (capkey->type) == EVP_PKEY_RSA)

ERROR: trailing statements should be on next line
+       if (cacert) X509_free(cacert);

ERROR: space prohibited after that open parenthesis '('
+                                       !(         (srv_op_state == SRV_ST_STOPPED)

9 years agoBUG/MAJOR: peers: fix a crash when stopping peers on unbound processes
Willy Tarreau [Mon, 21 Sep 2015 13:24:58 +0000 (15:24 +0200)] 
BUG/MAJOR: peers: fix a crash when stopping peers on unbound processes

Pradeep Jindal reported and troubleshooted a bug causing haproxy to die
during startup on all processes not making use of a peers section. It
only happens with nbproc > 1 when peers are declared. Technically it's
when the peers task is stopped on processes that don't use it that the
crash occurred (a task_free() called on a NULL task pointer).

This only affects peers v2 in the dev branch, no backport is needed.

9 years agoDOC: add a MAINTAINERS file
Willy Tarreau [Mon, 21 Sep 2015 13:21:09 +0000 (15:21 +0200)] 
DOC: add a MAINTAINERS file

This one indicates who to CC when sending changes affecting certain
parts of the product.

9 years agoMINOR: 51d: Improved string handling for LRU cache
James Rosewell [Fri, 18 Sep 2015 18:53:05 +0000 (19:53 +0100)] 
MINOR: 51d: Improved string handling for LRU cache

Removed use of strlen with the data added to and retrived from the cache
by using chunk structures instead of string pointers.

9 years agoMAJOR: 51d: Upgraded to support 51Degrees V3.2 and new features
James Rosewell [Fri, 18 Sep 2015 17:28:52 +0000 (18:28 +0100)] 
MAJOR: 51d: Upgraded to support 51Degrees V3.2 and new features

Trie device detection doesn't benefit from caching compared to Pattern.
As such the LRU cache has been removed from the Trie method.

A new fetch  method has been added named 51d.all which uses all the
available HTTP headers for device device detection. The previous 51d
conv method has been changed to 51d.single where one HTTP header,
typically User-Agent, is used for detection. This method is marginally
faster but less accurate.

Three new properties are available with the Pattern method called
Method, Difference and Rank which provide insight into the validity of
the results returned.

A pool of worksets is used to avoid needing to create a new workset for
every request. The workset pool is thread safe ready to support a future
multi threaded version of HAProxy.

9 years agoBUILD: Changed 51Degrees option to support V3.2
James Rosewell [Fri, 18 Sep 2015 16:24:29 +0000 (17:24 +0100)] 
BUILD: Changed 51Degrees option to support V3.2

Added support for city hash method, turned off multi threading support
and included maths library. Removed reference to compression library
which was never needed.

9 years agoDOC: Added more explanation for 51Degrees V3.2
James Rosewell [Fri, 18 Sep 2015 16:21:37 +0000 (17:21 +0100)] 
DOC: Added more explanation for 51Degrees V3.2

Changed examples to demonstrate the the new fetch and conv methods
available with the enhancements made in version 3.2 of 51Degrees.

Added reference to the accuracy indicators available with Pattern
detection method.

9 years agoMINOR: global: Added new fields for 51Degrees device detection
James Rosewell [Fri, 18 Sep 2015 16:13:47 +0000 (17:13 +0100)] 
MINOR: global: Added new fields for 51Degrees device detection

Added support for version 3.2 of 51Degrees C library.

Added fields to store HTTP header names important to device detection
other than User-Agent.

Included a pool of worksets for use with Pattern device detection.

9 years agoMINOR: http: made CHECK_HTTP_MESSAGE_FIRST accessible to other functions
James Rosewell [Fri, 18 Sep 2015 16:11:16 +0000 (17:11 +0100)] 
MINOR: http: made CHECK_HTTP_MESSAGE_FIRST accessible to other functions

Added the definition of CHECK_HTTP_MESSAGE_FIRST and the declaration of
smp_prefetch_http to the header.

Changed smp_prefetch_http implementation to remove the static qualifier.

9 years agoDOC: add a CONTRIBUTING file
Willy Tarreau [Sun, 20 Sep 2015 20:31:42 +0000 (22:31 +0200)] 
DOC: add a CONTRIBUTING file

This file tries to explain in the most detailed way how to contribute
patches. A few parts of it were moved from the README. .gitignore was
updated.

9 years agoDOC: add the documentation about internal circular lists
Willy Tarreau [Mon, 28 Jul 2003 23:16:05 +0000 (01:16 +0200)] 
DOC: add the documentation about internal circular lists

This file was recovered from the first project where it was born 12 years
ago, but it's still convenient to understand how our circular lists work,
so let's add it.

9 years agoDOC: servers state seamless reload example
Baptiste Assmann [Fri, 18 Sep 2015 14:38:21 +0000 (16:38 +0200)] 
DOC: servers state seamless reload example

A short doc + example to help people start using seamless reload for
server state

9 years agoMINOR: cli: new stats socket command: show backend
Baptiste Assmann [Fri, 18 Sep 2015 12:49:12 +0000 (14:49 +0200)] 
MINOR: cli: new stats socket command: show backend

new stats socket command which displays only the list of backends
available in the current process.
For now only the backend name is displayed.

9 years agoMINOR: server: startup slowstart task when using seamless reload of HAProxy
Baptiste Assmann [Thu, 17 Sep 2015 20:53:59 +0000 (22:53 +0200)] 
MINOR: server: startup slowstart task when using seamless reload of HAProxy

This patch uses the start up of the health check task to also start
the warmup task when required.

This is executed only once: when HAProxy has just started up and can
be started only if the load-server-state-from-file feature is enabled
and the server was in the warmup state before a reload occurs.

9 years agoMINOR: init: server state loaded from file
Baptiste Assmann [Fri, 14 Aug 2015 14:20:52 +0000 (16:20 +0200)] 
MINOR: init: server state loaded from file

With this patch, HAProxy reads the content of server state file and
update state of servers accordingly.

9 years agoDOC: load-server-state-from-file
Baptiste Assmann [Sun, 23 Aug 2015 09:45:29 +0000 (11:45 +0200)] 
DOC: load-server-state-from-file

9 years agoMINOR: config: new backend directives: load-server-state-from-file and server-state...
Baptiste Assmann [Wed, 19 Aug 2015 14:44:03 +0000 (16:44 +0200)] 
MINOR: config: new backend directives: load-server-state-from-file and server-state-file-name

This directive gives HAProxy the ability to use the either the global
server-state-file directive or a local one using server-state-file-name to
load server states.
The state can be saved right before the reload by the init script, using
the "show servers state" command on the stats socket redirecting output into
a file.

9 years agoDOC: new global directive: server-state-file
Baptiste Assmann [Sun, 23 Aug 2015 08:06:39 +0000 (10:06 +0200)] 
DOC: new global directive: server-state-file

Documentation related to a new global directive.
Purpose of this directive is to store a file path into the global
structure of HAProxy. The file pointed by the path may be used by
HAProxy to retrieve server state from the previous running process
after a reload occured.

9 years agoMINOR: config: new global section directive: server-state-file
Baptiste Assmann [Sun, 23 Aug 2015 07:54:31 +0000 (09:54 +0200)] 
MINOR: config: new global section directive: server-state-file

This new global section directive is used to store the path to the file
where HAProxy will be able to retrieve server states across reloads.

The file pointed by this path is used to store a file which can contains
state of all servers from all backends.

9 years agoDOC: global directive server-state-base
Baptiste Assmann [Sun, 23 Aug 2015 08:00:10 +0000 (10:00 +0200)] 
DOC: global directive server-state-base

Documentation relative to the new global directive server-state-file.

9 years agoMINOR: config: new global directive server-state-base
Baptiste Assmann [Sun, 23 Aug 2015 07:22:25 +0000 (09:22 +0200)] 
MINOR: config: new global directive server-state-base

This new global directive can be used to provide a base directory where
all the server state files could be loaded.
If a server state file name starts with a slash '/', then this directive
must not be applied.

9 years agoDOC: stats socket command: show servers state
Baptiste Assmann [Fri, 8 May 2015 17:35:08 +0000 (19:35 +0200)] 
DOC: stats socket command: show servers state

Documentation related to the new command available over the stats socket
"show servers state".

A description of the fields is also included.

9 years agoMINOR: cli: new stats socket command: show servers state
Baptiste Assmann [Fri, 3 Jul 2015 06:01:20 +0000 (08:01 +0200)] 
MINOR: cli: new stats socket command: show servers state

new command 'show servers state' which dumps all variable parameters
of a server during an HAProxy process life.
Purpose is to dump current server state at current run time in order to
read them right after the reload.

The format of the output is versionned and we support version 1 for now.

9 years agoMINOR: server: Macro definition for server-state
Baptiste Assmann [Fri, 8 May 2015 21:34:06 +0000 (23:34 +0200)] 
MINOR: server: Macro definition for server-state

Introduces a few new macros used by server state save and application accros reloads:
- currently used state server file format version
- currently used state server file header fields
- MIN and MAX value for version number
- maximum number of fields that could be found in a server-state file
- an arbitrary state-file max line length

9 years agoBUG/MAJOR: can't enable a server through the stat socket
Baptiste Assmann [Fri, 18 Sep 2015 08:30:03 +0000 (10:30 +0200)] 
BUG/MAJOR: can't enable a server through the stat socket

When a server is disabled in the configuration using the "disabled"
keyword, a single flag is positionned: SRV_ADMF_CMAINT (use to be
SRV_ADMF_FMAINT)..
That said, when providing the first version of this code, we also
changed the SRV_ADMF_MAINT mask to match any of the possible MAINT
cases: SRV_ADMF_FMAINT, SRV_ADMF_IMAINT, SRV_ADMF_CMAINT

Since SRV_ADMF_CMAINT is never (and is not supposed to be) altered at
run time, once a server has this flag set up, it can never ever be
enabled again using the stats socket.

In order to fix this, we should:
- consider SRV_ADMF_CMAINT as a simple flag to report the state in the
  old configuration file (will be used after a reload to deduce the
  state of the server in a new running process)
- enabling both SRV_ADMF_CMAINT and SRV_ADMF_FMAINT when the keyword
  "disabled" is in use in the configuration
- update the mask SRV_ADMF_MAINT as it was before, to only match
  SRV_ADMF_FMAINT and SRV_ADMF_IMAINT.

The following patch perform the changes above.
It allows fixing the regression without breaking the way the up coming
feature (seamless server state accross reloads) is going to work.

Note: this is 1.6-only, no backport needed.

9 years agoMINOR: support cpu-map feature through the compile option USE_CPU_AFFINITY on FreeBSD
Pieter Baauw [Thu, 17 Sep 2015 19:26:40 +0000 (21:26 +0200)] 
MINOR: support cpu-map feature through the compile option USE_CPU_AFFINITY on FreeBSD

9 years agoDOC: add references to rise/fall for the fastinter explanation
Pieter Baauw [Thu, 17 Sep 2015 19:30:46 +0000 (21:30 +0200)] 
DOC: add references to rise/fall for the fastinter explanation

9 years agoBUG/MINOR: lua: breaks the log message if his size exceed one buffer
Thierry FOURNIER [Wed, 16 Sep 2015 10:47:03 +0000 (12:47 +0200)] 
BUG/MINOR: lua: breaks the log message if his size exceed one buffer

Previously, the log was ignored if the log message exceed one buffer.
This patch doens't ignore the log, but trancate the message.

9 years agoBUG/MAJOR: lua: potential unexpected aborts()
Thierry FOURNIER [Thu, 17 Sep 2015 09:36:37 +0000 (11:36 +0200)] 
BUG/MAJOR: lua: potential unexpected aborts()

This couple of function executes securely some Lua calls outside of
the lua runtime environment. Each Lua call can return a longjmp
if it encounter a memory error.

Lua documentation extract:

   If an error happens outside any protected environment, Lua calls
   a panic function (see lua_atpanic) and then calls abort, thus
   exiting the host application. Your panic function can avoid this
   exit by never returning (e.g., doing a long jump to your own
   recovery point outside Lua).

   The panic function runs as if it were a message handler (see
   §2.3); in particular, the error message is at the top of the
   stack. However, there is no guarantee about stack space. To push
   anything on the stack, the panic function must first check the
   available space (see §4.2).

We must check all the Lua entry point. This includes:
 - The include/proto/hlua.h exported functions
 - the task wrapper function
 - The action wrapper function
 - The converters wrapper function
 - The sample-fetch wrapper functions

It is tolerated that the initilisation function returns an abort.
Before each Lua abort, an error message is writed on stderr.

The macro SET_SAFE_LJMP initialise the longjmp. The Macro
RESET_SAFE_LJMP reset the longjmp. These function must be macro
because they must be exists in the program stack when the longjmp
is called

9 years ago[RELEASE] Released version 1.6-dev5 v1.6-dev5
Willy Tarreau [Mon, 14 Sep 2015 10:23:10 +0000 (12:23 +0200)] 
[RELEASE] Released version 1.6-dev5

Released version 1.6-dev5 with the following main changes :
    - MINOR: dns: dns_resolution structure update: time_t to unsigned int
    - BUG/MEDIUM: dns: DNS resolution doesn't start
    - BUG/MAJOR: dns: dns client resolution infinite loop
    - MINOR: dns: coding style update
    - MINOR: dns: new bitmasks to use against DNS flags
    - MINOR: dns: dns_nameserver structure update: new counter for truncated response
    - MINOR: dns: New DNS response analysis code: DNS_RESP_TRUNCATED
    - MEDIUM: dns: handling of truncated response
    - MINOR: DNS client query type failover management
    - MINOR: dns: no expected DNS record type found
    - MINOR: dns: new flag to report that no IP can be found in a DNS response packet
    - BUG/MINOR: DNS request retry counter used for retry only
    - DOC: DNS documentation updated
    - MEDIUM: actions: remove ACTION_STOP
    - BUG/MEDIUM: lua: outgoing connection was broken since 1.6-dev2 (bis)
    - BUG/MINOR: lua: last log character truncated.
    - CLEANUP: typo: bad indent
    - CLEANUP: actions: missplaced includes
    - MINOR: build: missing header
    - CLEANUP: lua: Merge log functions
    - BUG/MAJOR: http: don't manipulate the server connection if it's killed
    - BUG/MINOR: http: remove stupid HTTP_METH_NONE entry
    - BUG/MAJOR: http: don't call http_send_name_header() after an error
    - MEDIUM: tools: make str2sa_range() optionally return the FQDN
    - BUG/MINOR: tools: make str2sa_range() report unresolvable addresses
    - BUG/MEDIUM: dns: use the correct server hostname when resolving

9 years agoCLEANUP: lua: Merge log functions
Thierry FOURNIER [Fri, 11 Sep 2015 17:15:43 +0000 (19:15 +0200)] 
CLEANUP: lua: Merge log functions

All the code which emits error log have the same pattern. Its:
Send log with syslog system, and if it is allowed, display error
log on screen.

This patch replace this pattern by a macro. This reduces the number
of lines.

9 years agoMINOR: build: missing header
Thierry FOURNIER [Fri, 11 Sep 2015 06:33:33 +0000 (08:33 +0200)] 
MINOR: build: missing header

Regex header file is missing in types/action.h

Repported by Conrad Hoffmann

I cannot build the current dev's master HEAD (ec3c37d) because of this error:

> In file included from include/proto/proto_http.h:26:0,
>                  from src/stick_table.c:26:
> include/types/action.h:102:20: error: field â\80\98reâ\80\99 has incomplete type
>     struct my_regex re;    /* used by replace-header and replace-value */
>                     ^
> Makefile:771: recipe for target 'src/stick_table.o' failed
> make: *** [src/stick_table.o] Error 1

The struct act_rule defined in action.h includes a full struct my_regex
without #include-ing regex.h. Both gcc 5.2.0 and clang 3.6.2 do not allow this.

9 years agoCLEANUP: actions: missplaced includes
Thierry FOURNIER [Thu, 10 Sep 2015 16:28:10 +0000 (18:28 +0200)] 
CLEANUP: actions: missplaced includes

The include of action.h are misplaced.

9 years agoCLEANUP: typo: bad indent
Thierry FOURNIER [Fri, 4 Sep 2015 16:40:36 +0000 (18:40 +0200)] 
CLEANUP: typo: bad indent

A space alignment remains in the stream_interface.c file

9 years agoDOC: DNS documentation updated
Baptiste Assmann [Tue, 8 Sep 2015 23:11:36 +0000 (01:11 +0200)] 
DOC: DNS documentation updated

More information regarding DNS resolution:
- behavior in case of errors
- behavior when multiple name servers are configured in a resolvers
  section
- when a retry is performed
- when a query type change is performed
- make it clear that DNS resolution requires health checking enabled
  on the server

9 years agoBUG/MINOR: DNS request retry counter used for retry only
Baptiste Assmann [Tue, 8 Sep 2015 22:54:38 +0000 (00:54 +0200)] 
BUG/MINOR: DNS request retry counter used for retry only

There are two types of retries when performing a DNS resolution:
1. retry because of a timeout
2. retry of the full sequence of requests (query types failover)

Before this patch, the 'resolution->try' counter was incremented
after each send of a DNS request, which does not cover the 2 cases
above.
This patch fix this behavior.

9 years agoMINOR: dns: new flag to report that no IP can be found in a DNS response packet
Baptiste Assmann [Tue, 8 Sep 2015 22:51:08 +0000 (00:51 +0200)] 
MINOR: dns: new flag to report that no IP can be found in a DNS response packet

Some DNS response may be valid from a protocol point of view but may not
contain any IP addresses.
This patch gives a new flag to the function dns_get_ip_from_response to
report such case.
It's up to the upper layer to decide what to do with this information.

9 years agoMINOR: dns: no expected DNS record type found
Baptiste Assmann [Tue, 8 Sep 2015 22:46:58 +0000 (00:46 +0200)] 
MINOR: dns: no expected DNS record type found

Some DNS responses may be valid from a protocol point of view, but may
not contain any information considered as interested by the requester..
Purpose of the flag DNS_RESP_NO_EXPECTED_RECORD introduced by this patch is
to allow reporting such situation.

When this happens, a new DNS query is sent with a new query type.

For now, the function only expect A and AAAA query types which is enough
to cover current cases.
In a next future, it will be up to the caller to tell the function which
query types are expected.

9 years agoBUG/MINOR: lua: last log character truncated.
Thierry FOURNIER [Wed, 9 Sep 2015 09:21:37 +0000 (11:21 +0200)] 
BUG/MINOR: lua: last log character truncated.

The send_log function needs a final \n.

This bug is repported by Michael Ezzell.

Minor bug: when writing to syslog from Lua scripts, the last character from
each log entry is truncated.

core.Alert("this is truncated");

Sep  7 15:07:56 localhost haproxy[7055]: this is truncate

This issue appears to be related to the fact that send_log() (in src/log.c)
is expecting a newline at the end of the message's format string:

/*
 * This function adds a header to the message and sends the syslog message
 * using a printf format string. It expects an LF-terminated message.
 */
void send_log(struct proxy *p, int level, const char *format, ...)

I believe the fix would be in in src/hlua.c at line 760
<http://git.haproxy.org/?p=haproxy.git;a=blob;f=src/hlua.c;h=1e4d47c31e66c16c837ff2aa5ef577f6cafdc7e7;hb=316e3196285b89a917c7d84794ced59a6a5b4eba#l760>,
where this...

   send_log(px, level, "%s", trash.str);

...should be adding a newline into the format string to accommodate what
the code expects.

    send_log(px, level, "%s\n", trash.str);

This change provides what seems to be the correct behavior:

Sep  7 15:08:30 localhost haproxy[7150]: this is truncated

All other uses of send_log() in hlua.c have a trailing dot "." in the
message that is masking the truncation issue because the output message
stops on a clean word boundary.  I suspect these would also benefit from
"\n" appended to their format strings as well, since this appears to be the
pattern seen throughout the rest of the code base.

Reported-by: Michael Ezzell <michael@ezzell.net>
9 years agoBUG/MEDIUM: dns: use the correct server hostname when resolving
Willy Tarreau [Tue, 8 Sep 2015 14:16:35 +0000 (16:16 +0200)] 
BUG/MEDIUM: dns: use the correct server hostname when resolving

The server's host name picked for resolution was incorrect, it did not
skip the address family specifier, did not resolve environment variables,
and messed up with the optional trailing colon.

Instead, let's get the fqdn returned by str2sa_range() and use that
exclusively.

9 years agoBUG/MINOR: tools: make str2sa_range() report unresolvable addresses
Willy Tarreau [Tue, 8 Sep 2015 14:01:25 +0000 (16:01 +0200)] 
BUG/MINOR: tools: make str2sa_range() report unresolvable addresses

If an environment variable is used in an address, and is not set, it's
silently considered as ":" or "0.0.0.0:0" which is not correct as it
can hide environment issues and lead to unexpected behaviours. Let's
report this case when it happens.

This fix should be backported to 1.5.

9 years agoMEDIUM: tools: make str2sa_range() optionally return the FQDN
Willy Tarreau [Tue, 8 Sep 2015 13:50:19 +0000 (15:50 +0200)] 
MEDIUM: tools: make str2sa_range() optionally return the FQDN

The function does a bunch of things among which resolving environment
variables, skipping address family specifiers and trimming port ranges.
It is the only one which sees the complete host name before trying to
resolve it. The DNS resolving code needs to know the original hostname,
so we modify this function to optionally provide it to the caller.

Note that the function itself doesn't know if the host part was a host
or an address, but str2ip() knows that and can be asked not to try to
resolve. So we first try to parse the address without resolving and
try again with resolving enabled. This way we know if the address is
explicit or needs some kind of resolution.

9 years agoMINOR: DNS client query type failover management
Baptiste Assmann [Wed, 2 Sep 2015 20:20:56 +0000 (22:20 +0200)] 
MINOR: DNS client query type failover management

In the first version of the DNS resolver, HAProxy sends an ANY query
type and in case of issue fails over to the type pointed by the
directive in 'resolve-prefer'.
This patch allows the following new failover management:
1. default query type is still ANY
2. if response is truncated or in error because ANY is not supported by
   the server, then a fail over to a new query type is performed. The
   new query type is the one pointed by the directive 'resolve-prefer'.
3. if no response or still some errors occurs, then a query type fail over
   is performed to the remaining IP address family.

9 years agoMEDIUM: dns: handling of truncated response
Baptiste Assmann [Wed, 2 Sep 2015 20:08:38 +0000 (22:08 +0200)] 
MEDIUM: dns: handling of truncated response

First dns client implementation simply ignored most of DNS response
flags.
This patch changes the way the flags are parsed, using bit masks and
also take care of truncated responses.
Such response are reported to the above layer which can handle it
properly.

9 years agoMINOR: dns: New DNS response analysis code: DNS_RESP_TRUNCATED
Baptiste Assmann [Wed, 2 Sep 2015 19:58:32 +0000 (21:58 +0200)] 
MINOR: dns: New DNS response analysis code: DNS_RESP_TRUNCATED

This patch introduces a new internal response state about the analysis
of a DNS response received by a server.
It is dedicated to report to above layer that the response is
'truncated'.

9 years agoMINOR: dns: dns_nameserver structure update: new counter for truncated response
Baptiste Assmann [Wed, 2 Sep 2015 19:56:05 +0000 (21:56 +0200)] 
MINOR: dns: dns_nameserver structure update: new counter for truncated response

This patch updates the dns_nameserver structure to integrate a counter
dedicated to 'truncated' response sent by servers.
Such response are important to track, since HAProxy is supposed to
replay its request.

9 years agoMINOR: dns: new bitmasks to use against DNS flags
Baptiste Assmann [Wed, 2 Sep 2015 19:52:37 +0000 (21:52 +0200)] 
MINOR: dns: new bitmasks to use against DNS flags

Current DNS client code implementation doesn't take care of response
flags setup by the server.
This patch introduces a couple of bitmasks one can use to retrieve the
truncated flag and the reply code available in the 2-bytes flag field.

9 years agoMINOR: dns: coding style update
Baptiste Assmann [Wed, 2 Sep 2015 20:05:24 +0000 (22:05 +0200)] 
MINOR: dns: coding style update

No affectation in a if condition.

9 years agoBUG/MAJOR: dns: dns client resolution infinite loop
Baptiste Assmann [Wed, 2 Sep 2015 20:15:58 +0000 (22:15 +0200)] 
BUG/MAJOR: dns: dns client resolution infinite loop

Under certain circonstance (a configuration with many servers relying on
DNS resolution and one of them triggering the replay of a request
because of a timeout or invalid response to an ANY query), HAProxy could
end up in an infinite loop over the currently supposed running DNS
queries.

This was caused because the FIFO list of running queries was improperly
updated in snr_resolution_error_cb. The head of the list was removed
instead of the resolution in error, when moving the resolution to the
end of the list.

In the mean time, a LIST_DEL statement is removed since useless. This
action is already performed by the dns_reset_resolution function.

9 years agoBUG/MEDIUM: dns: DNS resolution doesn't start
Baptiste Assmann [Thu, 3 Sep 2015 08:59:39 +0000 (10:59 +0200)] 
BUG/MEDIUM: dns: DNS resolution doesn't start

Patch f046f1156149d3d8563cc45d7608f2c42ef5b596 introduced a regression:
DNS resolution doesn't start anymore, while it was supposed to make it
start with first health check.

Current patch fix this issue by triggering a new DNS resolution if the
last_resolution time is not set.

9 years agoMINOR: dns: dns_resolution structure update: time_t to unsigned int
Baptiste Assmann [Thu, 3 Sep 2015 08:55:20 +0000 (10:55 +0200)] 
MINOR: dns: dns_resolution structure update: time_t to unsigned int

3 variables of the dns_resolution structure are set to 'time_t' type.
Since they are all set by 'now_ms' and used as 'ticks' in HAProxy's
internal, it is safer to set them to the same type than now_ms:
'unsigned int'.

9 years agoBUG/MAJOR: http: don't call http_send_name_header() after an error
Willy Tarreau [Mon, 7 Sep 2015 17:32:33 +0000 (19:32 +0200)] 
BUG/MAJOR: http: don't call http_send_name_header() after an error

A crash was reported when using the "famous" http-send-name-header
directive. This time it's a bit tricky, it requires a certain number of
conditions to be met including maxconn on a server, queuing, timeout in
the queue and cookie-based persistence.

The problem is that in stream.c, before calling http_send_name_header(),
we check a number of conditions to know if we have to replace the header
name. But prior to reaching this place, it's possible for
sess_update_stream_int() to fail and change the stream-int's state to
SI_ST_CLO, send an error 503 to the client, and flush all buffers. But
http_send_name_header() can only be called with valid buffer contents
matching the http_msg's description. So when it rewinds the stream to
modify the header, buf->o becomes negative by the size of the incoming
request and is used as the argument to memmove() which basically
displaces 4GB of memory off a few bytes to write the new name, resulting
in a core and a core file that's really not fun to play with.

The solution obviously consists in refraining from calling this nasty
function when the stream interface is already closed.

This bug also affects 1.5 and possibly 1.4, so the fix must be backported
there.