aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLonny Wong <lonnywong@qq.com>2023-11-22 00:20:18 +0800
committerAndy Green <andy@warmcat.com>2023-11-21 17:10:48 +0000
commiteba1e4aa7f4bb45e5c25297d6915ffe1835e655b (patch)
tree700f93656a50f1509f232b0338ff9a4a8f85f341
parent4415e84c095857629863804e941b9e1c2e9347ef (diff)
downloadlibwebsockets-eba1e4aa7f4bb45e5c25297d6915ffe1835e655b.tar.gz
pmd: fix buffer being reused while draining extensions
-rw-r--r--lib/roles/ws/ops-ws.c2
-rw-r--r--lib/roles/ws/private-lib-roles-ws.h1
-rw-r--r--lib/roles/ws/server-ws.c2
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) {