某字符串类型的记录,按该记录的定义,第一个DWORD表示该字符串的长度,后面是字符串内容。
Load时,从Stream中读取该记录的过程:
首先读出一个DWORD,保存为长度,
然后malloc相应长度的内存,用来保存字符串。
问题:stream中的内容被破坏,读出的字符串长度非常大,但是当前代码中对该数据的判断仅有:
if (nlength >0 &&nlength *sizeof(WCHAR) < INT_MAX)
显然这个判断是不够的。某非法长度通过了该判断,后续操作导致程序crash.
明显的解法是,查找相关文档,看该记录能够支持的有效长度是多少。但目前找不到这样的依据 或者规范。怎么办?
我的解法:
1. 看有没有其他的从stream中读取字符串长度的数据的代码,如果有的话,在其他代码里是怎么判断的。
全文件夹搜索如下正则 “[*][ ]*sizeof\(WCHAR\)[ ]*[<>]” 看是否有其他地方对字符串长度的判断.
2. 看看相应的Save函数是怎么写的。Save同样的记录之前应该也有类似的判断。