WebSocket下XOR数据帧二进制扫描结果异常排查求助
WebSocket帧解析异常排查求助
浏览器通过WebSocket向本地Tcl脚本传递如下JSON字符串:
{"ops":"AudioNotes EditSgmtTitle","params":{"doc_id":100,"title":"Short Segment Title (Looks Pretty Good aa Maybe)"},"reqId":1}
添加UI编辑分段标题功能时,偶然输入测试字符后发现:特定字符串长度会导致读取端出现异常,具体情况如下:
- 该字符串在Kate文本编辑器和活跃tclsh会话中,长度均为
127 - Tcl中读取XOR帧的起始代码:
if { [binary scan [coread $sock 2] B16 bits] != 1 || [scan $bits %1b%1b%1b%1b%4b%1b%7b \ fin rsv1 rsv2 rsv3 op m pl] != 7 } {
这段代码返回的payload长度(pl)为126,导致后续执行[binary scan [coread $sock 2] Su pl]读取两个字节作为无符号整数时,得到大小不定的超大值,例如:
Error in XOR_Read: expected non-negative integer but got "6717638123588400952" Closing socket.
Error in XOR_Read: expected non-negative integer but got "18173768903968447991" Closing socket.
- 当
title属性中的aa改为单个a时,pl仍为126,但XOR帧读取、解码均正常,doc_id为100的title可正确写入数据库 - 浏览器控制台输出的请求字符串始终一致,该Socket和XOR解码代码已稳定运行两年,仅当字符串长度恰好为127时触发异常,怀疑
coread协程存在问题,其代码如下:
proc ::WEBS::coread {sock reqBytes} { set fullRead {} set remBytes $reqBytes while {![chan eof $sock]} { yield append fullRead [set loopRead [read $sock $remBytes]] if {[incr remBytes -[string length $loopRead]] == 0} { return $fullRead } } throw {COREAD EOF} "Unexpected WEBS EOF" }
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

