@@ -6592,6 +6592,7 @@ discord_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInpu
65926592
65936593 length_code = 0 ;
65946594 purple_ssl_read (conn , & length_code , 1 );
6595+ length_code = length_code & ~0x80 ;
65956596
65966597 if (length_code <= 125 ) {
65976598 ya -> frame_len = length_code ;
@@ -6601,6 +6602,18 @@ discord_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInpu
66016602 } else if (length_code == 127 ) {
66026603 purple_ssl_read (conn , & ya -> frame_len , 8 );
66036604 ya -> frame_len = GUINT64_FROM_BE (ya -> frame_len );
6605+ if ((ya -> frame_len & (1ULL << 63 )) != 0 ) {
6606+ purple_debug_error ("discord" , "Frame length has MSB set, possible protocol error\n" );
6607+ purple_connection_error (ya -> pc , PURPLE_CONNECTION_ERROR_NETWORK_ERROR , _ ("Websocket protocol error" ));
6608+ return ;
6609+ }
6610+ }
6611+
6612+ // Check for unreasonable frame_len value
6613+ if (ya -> frame_len > (16 * 1024 * 1024 )) { // 16MB max frame size
6614+ purple_debug_error ("discord" , "Unreasonable frame length: %" G_GUINT64_FORMAT "\n" , ya -> frame_len );
6615+ purple_connection_error (ya -> pc , PURPLE_CONNECTION_ERROR_NETWORK_ERROR , _ ("Websocket protocol error: unreasonable frame length" ));
6616+ return ;
66046617 }
66056618
66066619 ya -> frame = g_new0 (gchar , ya -> frame_len + 1 );
0 commit comments