mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-19 10:14:41 +00:00
haproxy public development tree
e7281f3f5d
In hlua_ctx_resume(), we call lua_resume() function like this: lua_resume(lua->T, hlua_states[lua->state_id], lua->nargs) Once the call returns, we may call the function again with the same hlua context when E_YIELD is returned (the execution was interrupted and may be resumed through another lua_resume() call). The 3rd argument to lua_resume(), 'nargs', is a hint passed to Lua to know how many (optional) arguments were pushed on the stack prior to resuming the execution (arguments that Lua will then expose to the Lua script). But here is the catch: we never reset lua->nargs between successive lua_resume() calls, meaning that next lua_resume() calls will still inherit from the initial nargs value that was set in hlua ctx prior to calling hlua_ctx_resume() (our wrapper function) for the first time. This is problematic, because despite not being explicitly mentioned in the Lua documentation, passed arguments (to which `nargs` refer to), are already consumed once lua_resume() returns. This means that we cannot keep calling lua_resume() with non-zero nargs if we don't push new arguments on the stack prior to resuming lua after the initial call: nargs is proper to a single lua_resume() invocation. Despite improper use of lua_resume() for a long time, this didn't cause visible issues in the past with Lua 5.3, but it is particularly sensitive starting with Lua 5.4.3 due to debugging hooks improvements that led to some internal changes (see: lua/lua@58aa09a). Not using nargs properly now exposes us to undefined behavior when resuming after a yield triggered from a debugging hook, which may cause running scripts to crash unexpectedly: for instance with Lua raising errors and complaining about values being NULL where it should not be the case. For reference, this issue was initially raised on the Lua mailing list: http://lua-users.org/lists/lua-l/2023-09/msg00005.html In this patch, we immediately reset nargs when lua_resume() returns to prevent any misuse. It should be backported to every maintained versions. |
||
---|---|---|
.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 | ||
SUBVERS | ||
VERDATE | ||
VERSION |
The HAProxy documentation has been split into a number of different files for ease of use. 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)