mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
BUG/MEDIUM: mcli: always realign wrapping buffers before parsing them
Pipelined commands easily result in request buffers to wrap, and the master-cli parser only deals with linear buffers since it needs contiguous keywords to look for in a list. As soon as a buffer wraps, some commands are ignored and the parser is called in loops because the wrapped data do not leave the buffer. Let's take the easiest path that's already used at the HTTP layer, we simply realign the buffer if its input wraps. This rarely happens anyway (typically once per buffer), remains reasonably cheap and guarantees this cannot happen anymore. This needs to be backported as far as 2.0.
This commit is contained in:
parent
6cd93f52e9
commit
a4e4d66f70
13
src/cli.c
13
src/cli.c
@ -2278,8 +2278,8 @@ int pcli_find_and_exec_kw(struct stream *s, char **args, int argl, char **errmsg
|
||||
*/
|
||||
int pcli_parse_request(struct stream *s, struct channel *req, char **errmsg, int *next_pid)
|
||||
{
|
||||
char *str = (char *)ci_head(req);
|
||||
char *end = (char *)ci_stop(req);
|
||||
char *str;
|
||||
char *end;
|
||||
char *args[MAX_CLI_ARGS + 1]; /* +1 for storing a NULL */
|
||||
int argl; /* number of args */
|
||||
char *p;
|
||||
@ -2290,6 +2290,15 @@ int pcli_parse_request(struct stream *s, struct channel *req, char **errmsg, int
|
||||
int ret;
|
||||
int i = 0;
|
||||
|
||||
/* we cannot deal with a wrapping buffer, so let's take care of this
|
||||
* first.
|
||||
*/
|
||||
if (b_head(&req->buf) + b_data(&req->buf) > b_wrap(&req->buf))
|
||||
b_slow_realign(&req->buf, trash.area, co_data(req));
|
||||
|
||||
str = (char *)ci_head(req);
|
||||
end = (char *)ci_stop(req);
|
||||
|
||||
p = str;
|
||||
|
||||
if (!(s->pcli_flags & PCLI_F_PAYLOAD)) {
|
||||
|
Loading…
Reference in New Issue
Block a user