Some actions such as "sc0_get_gpc0" (using smp_fetch_sc_stkctr() internally) can take an optional table name as parameter to perform the lookup on a different table from the tracked one but using the key from the tracked entry. It is done by leveraging the stktable_lookup() function which was originally meant to perform intra-table lookups. Calling sc0_get_gpc0() with a different table name will result in stktable_lookup() being called to perform lookup using a stktsess from a different table. While it is theorically fine, it comes with a pitfall: both tables (the one from where the stktsess originates and the actual target table) should rely on the exact same key type and length. Failure to do so actually results in undefined behavior, because the key type and/or length from one table is used to perform the lookup in another table, while the underlying lookup API expects explicit type and key length. For instance, consider the below example: peers testpeers bind 127.0.0.1:10001 server localhost table test type binary len 1 size 100k expire 1h store gpc0 table test2 type string size 100k expire 1h store gpc0 listen test_px mode http bind 0.0.0.0:8080 http-request track-sc0 bin(AA) table testpeers/test http-request track-sc1 str(ok) table testpeers/test2 log-format "%[sc0_get_gpc0(testpeers/test2)]" log stdout format raw local0 server s1 git.haproxy.org:80 Performing a curl request to localhost:8080 will cause unitialized reads because string "ok" from test2 table will be compared as a string against "AA" binary sample which is not NULL terminated: ==2450742== Conditional jump or move depends on uninitialised value(s) ==2450742== at 0x484F238: strlen (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==2450742== by 0x27BCE6: stktable_lookup (stick_table.c:539) ==2450742== by 0x281470: smp_fetch_sc_stkctr (stick_table.c:3580) ==2450742== by 0x283083: smp_fetch_sc_get_gpc0 (stick_table.c:3788) ==2450742== by 0x2A805C: sample_process (sample.c:1376) So let's prevent that by adding some comments in stktable_set_entry() func description, and by adding a check in smp_fetch_sc_stkctr() to ensure both source stksess and target table share the same key properties. While it could be relevant to backport this in all stable versions, it is probably safer to wait for some time before doing so, to ensure that no existing configs rely on this ambiguity because the fact that the target table and source stksess entry need to share the same key type and length is not explicitly documented. |
||
---|---|---|
.github | ||
addons | ||
admin | ||
dev | ||
doc | ||
examples | ||
include | ||
reg-tests | ||
scripts | ||
src | ||
tests | ||
.cirrus.yml | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
.travis.yml | ||
BRANCHES | ||
BSDmakefile | ||
CHANGELOG | ||
CONTRIBUTING | ||
INSTALL | ||
LICENSE | ||
MAINTAINERS | ||
Makefile | ||
README.md | ||
SUBVERS | ||
VERDATE | ||
VERSION |
HAProxy
HAProxy is a free, very fast and reliable reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.
Installation
The INSTALL file describes how to build HAProxy. A list of packages is also available on the wiki.
Getting help
The discourse and the mailing-list are available for questions or configuration assistance. You can also use the slack or IRC channel. Please don't use the issue tracker for these.
The issue tracker is only for bug reports or feature requests.
Documentation
The HAProxy documentation has been split into a number of different files for ease of use. It is available in text format as well as HTML. The wiki is also meant to replace the old architecture guide.
Please refer to the following files depending on what you're looking for:
- INSTALL for instructions on how to build and install HAProxy
- BRANCHES to understand the project's life cycle and what version to use
- LICENSE for the project's license
- CONTRIBUTING for the process to follow to submit contributions
The more detailed documentation is located into the doc/ directory:
- doc/intro.txt for a quick introduction on HAProxy
- doc/configuration.txt for the configuration's reference manual
- doc/lua.txt for the Lua's reference manual
- doc/SPOE.txt for how to use the SPOE engine
- doc/network-namespaces.txt for how to use network namespaces under Linux
- doc/management.txt for the management guide
- doc/regression-testing.txt for how to use the regression testing suite
- doc/peers.txt for the peers protocol reference
- doc/coding-style.txt for how to adopt HAProxy's coding style
- doc/internals for developer-specific documentation (not all up to date)
License
HAProxy is licensed under GPL 2 or any later version, the headers under LGPL 2.1. See the LICENSE file for a more detailed explanation.