diff options
author | Lonny Wong <lonnywong@qq.com> | 2023-11-22 00:20:18 +0800 |
---|---|---|
committer | Andy Green <andy@warmcat.com> | 2023-11-21 17:10:48 +0000 |
commit | eba1e4aa7f4bb45e5c25297d6915ffe1835e655b (patch) | |
tree | 700f93656a50f1509f232b0338ff9a4a8f85f341 | |
parent | 4415e84c095857629863804e941b9e1c2e9347ef (diff) | |
download | libwebsockets-eba1e4aa7f4bb45e5c25297d6915ffe1835e655b.tar.gz |
pmd: fix buffer being reused while draining extensions
-rw-r--r-- | lib/roles/ws/ops-ws.c | 2 | ||||
-rw-r--r-- | lib/roles/ws/private-lib-roles-ws.h | 1 | ||||
-rw-r--r-- | lib/roles/ws/server-ws.c | 2 |
3 files changed, 3 insertions, 2 deletions
diff --git a/lib/roles/ws/ops-ws.c b/lib/roles/ws/ops-ws.c index 37fbd34d..3898457a 100644 --- a/lib/roles/ws/ops-ws.c +++ b/lib/roles/ws/ops-ws.c @@ -723,7 +723,7 @@ utf8_fail: } #if !defined(LWS_WITHOUT_EXTENSIONS) - if (!lin) + if (!lin && !(already_processed & ALREADY_PROCESSED_FULL_DRAINING)) break; #endif diff --git a/lib/roles/ws/private-lib-roles-ws.h b/lib/roles/ws/private-lib-roles-ws.h index d0b08707..69033d6c 100644 --- a/lib/roles/ws/private-lib-roles-ws.h +++ b/lib/roles/ws/private-lib-roles-ws.h @@ -75,6 +75,7 @@ enum lws_websocket_opcodes_07 { #define ALREADY_PROCESSED_IGNORE_CHAR 1 #define ALREADY_PROCESSED_NO_CB 2 +#define ALREADY_PROCESSED_FULL_DRAINING 4 #if !defined(LWS_WITHOUT_EXTENSIONS) struct lws_vhost_role_ws { diff --git a/lib/roles/ws/server-ws.c b/lib/roles/ws/server-ws.c index b8469a4c..f746ab31 100644 --- a/lib/roles/ws/server-ws.c +++ b/lib/roles/ws/server-ws.c @@ -1080,7 +1080,7 @@ lws_parse_ws(struct lws *wsi, unsigned char **buf, size_t len) wsi->ws->rx_draining_ext); #endif m = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR | - ALREADY_PROCESSED_NO_CB, 0); + ALREADY_PROCESSED_NO_CB | ALREADY_PROCESSED_FULL_DRAINING, 0); } if (m < 0) { |