haproxy/src
Willy Tarreau abf08d9365 BUG/MAJOR: connection: fix mismatch between rcv_buf's API and usage
Steve Ruiz reported some reproducible crashes with HTTP health checks
on a certain page returning a huge length. The traces he provided
clearly showed that the recv() call was performed twice for a total
size exceeding the buffer's length.

Cyril Bonté tracked down the problem to be caused by the full buffer
size being passed to rcv_buf() in event_srv_chk_r() instead of passing
just the remaining amount of space. Indeed, this change happened during
the connection rework in 1.5-dev13 with the following commit :

f150317 MAJOR: checks: completely use the connection transport layer

But one of the problems is also that the comments at the top of the
rcv_buf() functions suggest that the caller only has to ensure the
requested size doesn't overflow the buffer's size.

Also, these functions already have to care about the buffer's size to
handle wrapping free space when there are pending data in the buffer.
So let's change the API instead to more closely match what could be
expected from these functions :

- the caller asks for the maximum amount of bytes it wants to read ;
This means that only the caller is responsible for enforcing the
reserve if it wants to (eg: checks don't).

- the rcv_buf() functions fix their computations to always consider
this size as a max, and always perform validity checks based on
the buffer's free space.

As a result, the code is simplified and reduced, and made more robust
for callers which now just have to care about whether they want the
buffer to be filled or not.

Since the bug was introduced in 1.5-dev13, no backport to stable versions
is needed.
2014-01-15 01:09:48 +01:00
..
acl.c BUG/MINOR: acl: parser must also stop at comma on ACL-only keywords 2013-12-16 22:01:06 +01:00
appsession.c BUILD: definitely silence some stupid GCC warnings 2013-12-13 15:21:36 +01:00
arg.c MINOR: arg: improve wording on error reporting 2013-12-13 00:38:47 +01:00
auth.c MINOR: acl/pattern: use types different from int to clarify who does what. 2013-12-02 23:31:33 +01:00
backend.c MINOR: http: try to stick to same server after status 401/407 2013-12-23 15:12:44 +01:00
base64.c [MINOR] add encode/decode function for 30-bit integers from/to base64 2010-10-30 19:04:33 +02:00
buffer.c MINOR: buffer: align the last output line if there are less than 8 characters left 2013-11-21 08:07:04 +01:00
cfgparse.c MEDIUM: config: report a warning when multiple servers have the same name 2014-01-03 12:20:22 +01:00
channel.c MAJOR: channel: add a new flag CF_WAKE_WRITE to notify the task of writes 2013-12-31 18:37:36 +01:00
checks.c BUG/MAJOR: connection: fix mismatch between rcv_buf's API and usage 2014-01-15 01:09:48 +01:00
chunk.c MINOR: chunks: always initialize the output chunk in get_trash_chunk() 2013-12-14 16:02:18 +01:00
compression.c MEDIUM: sample: systematically pass the keyword pointer to the keyword 2013-08-01 21:17:13 +02:00
connection.c MEDIUM: connection: merge the send_proxy and local_send_proxy calls 2013-12-09 15:40:23 +01:00
cttproxy.c CLEANUP: cttproxy: remove a warning on undeclared close() 2012-10-05 22:18:07 +02:00
dumpstats.c MAJOR: channel: add a new flag CF_WAKE_WRITE to notify the task of writes 2013-12-31 18:37:36 +01:00
ev_epoll.c BUG: Revert "OPTIM/MEDIUM: epoll: fuse active events into polled ones during polling changes" 2013-12-20 16:03:41 +01:00
ev_kqueue.c BUG/MINOR: poll: the I/O handler was called twice for polled I/Os 2012-12-14 00:17:03 +01:00
ev_poll.c MEDIUM: poll: do not use FD_* macros anymore 2013-03-31 15:01:01 +02:00
ev_select.c BUG/MAJOR: ev_select: disable the select() poller if maxsock > FD_SETSIZE 2013-03-31 15:01:05 +02:00
fd.c MEDIUM: connection: centralize handling of nolinger in fd management 2013-12-16 02:23:52 +01:00
freq_ctr.c BUG/MINOR: time: frequency counters are not totally accurate 2012-12-29 21:50:07 +01:00
frontend.c MEDIUM: connection: centralize handling of nolinger in fd management 2013-12-16 02:23:52 +01:00
haproxy-systemd-wrapper.c BUILD/MINOR: systemd: fix compiler warning about unused result 2013-12-10 08:50:55 +01:00
haproxy.c BUILD: definitely silence some stupid GCC warnings 2013-12-13 15:21:36 +01:00
hash.c MEDIUM: backend: add support for the wt6 hash 2013-11-14 16:37:50 +01:00
hdr_idx.c OPTIM/MINOR: move the hdr_idx pools out of the proxy struct 2011-10-24 18:15:04 +02:00
i386-linux-vsys.c MEDIUM: listener: add support for linux's accept4() syscall 2012-10-08 20:11:03 +02:00
lb_chash.c BUG/MAJOR: server: weight calculation fails for map-based algorithms 2013-11-21 15:09:02 +01:00
lb_fas.c BUG/MAJOR: server: weight calculation fails for map-based algorithms 2013-11-21 15:09:02 +01:00
lb_fwlc.c BUG/MAJOR: server: weight calculation fails for map-based algorithms 2013-11-21 15:09:02 +01:00
lb_fwrr.c BUG/MAJOR: server: weight calculation fails for map-based algorithms 2013-11-21 15:09:02 +01:00
lb_map.c BUG/MAJOR: server: weight calculation fails for map-based algorithms 2013-11-21 15:09:02 +01:00
listener.c BUILD/MINOR: listener: remove a glibc warning on accept4() 2014-01-14 17:54:12 +01:00
log.c BUILD: log: fix build warning on Solaris 2013-12-16 02:23:51 +01:00
map.c MINOR: map: export parse output sample functions 2013-12-12 15:44:05 +01:00
memory.c MEDIUM: memory: add the ability to poison memory at run time 2012-05-08 21:28:16 +02:00
pattern.c BUG/MINOR: pattern: pattern comparison executed twice 2014-01-14 15:42:59 +01:00
payload.c BUG/MEDIUM: http: cook_cnt() forgets to set its output type 2013-12-16 15:21:29 +01:00
peers.c MEDIUM: peers: delay appctx initialization 2013-12-09 15:40:23 +01:00
pipe.c BUILD/MINOR: silent a build warning in src/pipe.c (fcntl) 2011-10-24 17:09:22 +02:00
proto_http.c BUG/MINOR: http: don't clear the SI_FL_DONT_WAKE flag between requests 2013-12-31 23:03:09 +01:00
proto_tcp.c MEDIUM: connection: centralize handling of nolinger in fd management 2013-12-16 02:23:52 +01:00
proto_uxst.c MAJOR: listener: support inheriting a listening fd from the parent 2013-03-11 01:30:01 +01:00
protocol.c REORG: split "protocols" files into protocol and listener 2012-09-15 22:29:32 +02:00
proxy.c MEDIUM: checks: add send/expect tcp based check 2013-12-06 11:50:47 +01:00
queue.c MAJOR: connection: replace struct target with a pointer to an enum 2012-11-12 00:42:33 +01:00
raw_sock.c BUG/MAJOR: connection: fix mismatch between rcv_buf's API and usage 2014-01-15 01:09:48 +01:00
rbtree.c [MINOR] imported the rbtree function from Linux kernel 2007-01-07 02:12:57 +01:00
regex.c MINOR: regex: Copy the original regex expression into string. 2013-12-12 15:43:34 +01:00
sample.c BUG/MEDIUM: sample: simplify and fix the argument parsing 2013-12-13 01:33:33 +01:00
server.c MINOR: checks: use check->state instead of srv->state & SRV_CHECKED 2013-12-14 16:02:19 +01:00
session.c OPTIM: session: put unlikely() around the freewheeling code 2013-12-31 23:56:46 +01:00
sessionhash.c [PATCH] appsessions: cleanup DEBUG_HASH and initialize request_counter 2008-08-13 23:43:26 +02:00
shctx.c BUG/MEDIUM: shctx: makes the code independent on SSL runtime version. 2013-04-26 19:15:52 +02:00
signal.c BUG/MEDIUM: signal: signal handler does not properly check for signal bounds 2013-01-24 16:19:19 +01:00
ssl_sock.c BUG/MAJOR: connection: fix mismatch between rcv_buf's API and usage 2014-01-15 01:09:48 +01:00
standard.c MINOR: standard: The function parse_binary() can use preallocated buffer 2013-12-12 15:42:11 +01:00
stick_table.c BUG/MEDIUM: acl: fix regression introduced by latest converters support 2013-12-05 02:23:13 +01:00
stream_interface.c MAJOR: channel: add a new flag CF_WAKE_WRITE to notify the task of writes 2013-12-31 18:37:36 +01:00
task.c [OPTIM] task: don't scan the run queue if we know it's empty 2011-09-10 20:08:49 +02:00
time.c BUG/MINOR: time: frequency counters are not totally accurate 2012-12-29 21:50:07 +01:00
trace.c MINOR: add a new function call tracer for debugging purposes 2012-05-26 00:12:37 +02:00
uri_auth.c BUG/MEDIUM: uri_auth: missing NULL check and memory leak on memory shortage 2013-01-24 16:19:19 +01:00