Skip to content

Commit 1861efc

Browse files
committed
fix websocket ping frame
1 parent 940d659 commit 1861efc

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

src/kws.c

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ struct kws_s {
8888
ks_json_t *params;
8989

9090
ks_ssize_t payload_size_max;
91+
int min_bytes;
9192
};
9293

9394

@@ -912,9 +913,11 @@ KS_DECLARE(ks_status_t) kws_init_ex(kws_t **kwsP, ks_socket_t sock, SSL_CTX *ssl
912913
}
913914

914915
kws->type = KWS_CLIENT;
916+
kws->min_bytes = 2;
915917
} else {
916918
kws->type = KWS_SERVER;
917919
kws->flags |= KWS_FLAG_DONTMASK;
920+
kws->min_bytes = 6;
918921
}
919922

920923
kws->sock = sock;
@@ -1312,7 +1315,7 @@ KS_DECLARE(ks_ssize_t) kws_read_frame(kws_t *kws, kws_opcode_t *oc, uint8_t **da
13121315
return kws_close(kws, WS_NONE);
13131316
}
13141317

1315-
if ((kws->datalen = kws_string_read(kws, kws->buffer, 9 + 1, kws->block)) < 0) { // read 9 bytes into NULL terminated 10 byte buffer
1318+
if ((kws->datalen = kws_string_read(kws, kws->buffer, kws->min_bytes + 1, kws->block)) < 0) { // read 9 bytes into NULL terminated 10 byte buffer
13161319
ks_log(KS_LOG_ERROR, "Read frame error because kws_string_read returned %ld\n", kws->datalen);
13171320
if (kws->datalen == -2) {
13181321
return -2;
@@ -1321,7 +1324,7 @@ KS_DECLARE(ks_ssize_t) kws_read_frame(kws_t *kws, kws_opcode_t *oc, uint8_t **da
13211324
}
13221325

13231326
if (kws->datalen < need) {
1324-
ssize_t bytes = kws_string_read(kws, kws->buffer + kws->datalen, 9 - kws->datalen, WS_BLOCK);
1327+
ssize_t bytes = kws_string_read(kws, kws->buffer + kws->datalen, kws->min_bytes - kws->datalen + 1, WS_BLOCK);
13251328

13261329
if (bytes < 0 || (kws->datalen += bytes) < need) {
13271330
/* too small - protocol err */
@@ -1358,20 +1361,6 @@ KS_DECLARE(ks_ssize_t) kws_read_frame(kws_t *kws, kws_opcode_t *oc, uint8_t **da
13581361
frag = 0;
13591362
}
13601363

1361-
if (mask) {
1362-
need += 4;
1363-
1364-
if (need > kws->datalen) {
1365-
ks_ssize_t bytes = kws_string_read_blocking(kws, kws->buffer + kws->datalen, need - kws->datalen + 1, 10);
1366-
if (bytes < 0 || (kws->datalen += bytes) < need) {
1367-
/* too small - protocol err */
1368-
ks_log(KS_LOG_ERROR, "Read frame error because not enough data for mask\n");
1369-
*oc = WSOC_CLOSE;
1370-
return kws_close(kws, WS_NONE);
1371-
}
1372-
}
1373-
}
1374-
13751364
kws->plen = kws->buffer[1] & 0x7f;
13761365
kws->payload = &kws->buffer[2];
13771366

@@ -1390,7 +1379,8 @@ KS_DECLARE(ks_ssize_t) kws_read_frame(kws_t *kws, kws_opcode_t *oc, uint8_t **da
13901379
return kws_close(kws, WS_NONE);
13911380
}
13921381
}
1393-
1382+
1383+
kws->payload = &kws->buffer[2];
13941384
u64 = (uint64_t *) kws->payload;
13951385
kws->payload += 8;
13961386
kws->plen = (ks_ssize_t)ntoh64(*u64);
@@ -1409,12 +1399,29 @@ KS_DECLARE(ks_ssize_t) kws_read_frame(kws_t *kws, kws_opcode_t *oc, uint8_t **da
14091399
}
14101400
}
14111401

1402+
kws->payload = &kws->buffer[2];
14121403
u16 = (uint16_t *) kws->payload;
14131404
kws->payload += 2;
14141405
kws->plen = ntohs(*u16);
1406+
} else if(kws->plen == 0) {
1407+
if(*oc == WSOC_PING) {
1408+
*data = NULL;
1409+
return 0;
1410+
}
14151411
}
14161412

14171413
if (mask) {
1414+
need += 4;
1415+
if (need > kws->datalen) {
1416+
ks_ssize_t bytes = kws_string_read_blocking(kws, kws->buffer + kws->datalen, need - kws->datalen + 1, 10);
1417+
if (bytes < 0 || (kws->datalen += bytes) < need) {
1418+
/* too small - protocol err */
1419+
ks_log(KS_LOG_ERROR, "Read frame error because not enough data for mask\n");
1420+
*oc = WSOC_CLOSE;
1421+
return kws_close(kws, WS_NONE);
1422+
}
1423+
}
1424+
14181425
maskp = (char *)kws->payload;
14191426
kws->payload += 4;
14201427
}

0 commit comments

Comments
 (0)