@@ -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