mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-30 00:00:16 +01:00
fix broken ext arg parsing
This gets us back to all the Autobahn tests passing Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
parent
d738f84ed1
commit
3f63560876
2 changed files with 14 additions and 8 deletions
10
lib/client.c
10
lib/client.c
|
@ -749,8 +749,11 @@ check_extensions:
|
||||||
/*
|
/*
|
||||||
* give the extension the server options
|
* give the extension the server options
|
||||||
*/
|
*/
|
||||||
if (a && lws_ext_parse_options(ext, wsi, wsi->act_ext_user[wsi->count_act_ext], opts, a, c - a)) {
|
if (a && lws_ext_parse_options(ext, wsi,
|
||||||
lwsl_err("%s: unable to parse remote defaults '%s'", __func__, a);
|
wsi->act_ext_user[wsi->count_act_ext],
|
||||||
|
opts, a, c - a)) {
|
||||||
|
lwsl_err("%s: unable to parse remote def '%s'",
|
||||||
|
__func__, a);
|
||||||
goto bail2;
|
goto bail2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -758,7 +761,8 @@ check_extensions:
|
||||||
LWS_EXT_CB_OPTION_CONFIRM,
|
LWS_EXT_CB_OPTION_CONFIRM,
|
||||||
wsi->act_ext_user[wsi->count_act_ext],
|
wsi->act_ext_user[wsi->count_act_ext],
|
||||||
NULL, 0)) {
|
NULL, 0)) {
|
||||||
lwsl_err("%s: ext %s rejects server options %s", ext->name, a);
|
lwsl_err("%s: ext %s rejects server options %s",
|
||||||
|
ext->name, a);
|
||||||
goto bail2;
|
goto bail2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,8 @@ enum lws_ext_option_parser_states {
|
||||||
|
|
||||||
LWS_VISIBLE int
|
LWS_VISIBLE int
|
||||||
lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
||||||
void *ext_user, const struct lws_ext_options *opts, const char *in, int len)
|
void *ext_user, const struct lws_ext_options *opts,
|
||||||
|
const char *in, int len)
|
||||||
{
|
{
|
||||||
enum lws_ext_option_parser_states leap = LEAPS_SEEK_NAME;
|
enum lws_ext_option_parser_states leap = LEAPS_SEEK_NAME;
|
||||||
unsigned int match_map = 0, n, m, w = 0, count_options = 0,
|
unsigned int match_map = 0, n, m, w = 0, count_options = 0,
|
||||||
|
@ -31,7 +32,7 @@ lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
||||||
while (opts[count_options].name)
|
while (opts[count_options].name)
|
||||||
count_options++;
|
count_options++;
|
||||||
while (len) {
|
while (len) {
|
||||||
lwsl_ext("'%c'", *in);
|
lwsl_ext("'%c' %d", *in, leap);
|
||||||
switch (leap) {
|
switch (leap) {
|
||||||
case LEAPS_SEEK_NAME:
|
case LEAPS_SEEK_NAME:
|
||||||
if (*in == ' ')
|
if (*in == ' ')
|
||||||
|
@ -51,11 +52,10 @@ lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
||||||
oa.len = 0;
|
oa.len = 0;
|
||||||
m = match_map;
|
m = match_map;
|
||||||
n = 0;
|
n = 0;
|
||||||
w = 0;
|
|
||||||
pending_close_quote = 0;
|
pending_close_quote = 0;
|
||||||
while (m) {
|
while (m) {
|
||||||
if (m & 1) {
|
if (m & 1) {
|
||||||
// lwsl_ext(" m=%d, n=%d\n", m, n);
|
lwsl_ext(" m=%d, n=%d, w=%d\n", m, n, w);
|
||||||
|
|
||||||
if (*in == opts[n].name[w]) {
|
if (*in == opts[n].name[w]) {
|
||||||
if (!opts[n].name[w + 1]) {
|
if (!opts[n].name[w + 1]) {
|
||||||
|
@ -68,8 +68,10 @@ lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
match_map &= ~(1 << n);
|
match_map &= ~(1 << n);
|
||||||
if (!match_map)
|
if (!match_map) {
|
||||||
|
lwsl_ext("empty match map\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m >>= 1;
|
m >>= 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue