从Stream中读取字符串长度,数值过大导致后期操作Crash

本文讨论了一个关于字符串读取的问题,即当stream中的内容被破坏,导致读取的字符串长度异常大时,如何避免程序崩溃。文章提出了解决方案,并建议通过审查相关代码和保存函数来进一步验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某字符串类型的记录,按该记录的定义,第一个DWORD表示该字符串的长度,后面是字符串内容。


Load时,从Stream中读取该记录的过程:

首先读出一个DWORD,保存为长度,

然后malloc相应长度的内存,用来保存字符串。


问题:stream中的内容被破坏,读出的字符串长度非常大,但是当前代码中对该数据的判断仅有:
if (nlength >0 &&nlength *sizeof(WCHAR) < INT_MAX)
显然这个判断是不够的。某非法长度通过了该判断,后续操作导致程序crash.

明显的解法是,查找相关文档,看该记录能够支持的有效长度是多少。但目前找不到这样的依据 或者规范。怎么办?


我的解法:

1.      看有没有其他的从stream中读取字符串长度的数据的代码,如果有的话,在其他代码里是怎么判断的。

全文件夹搜索如下正则 “[*][ ]*sizeof\(WCHAR\)[ ]*[<>]”  看是否有其他地方对字符串长度的判断.
2.      看看相应的Save函数是怎么写的。Save同样的记录之前应该也有类似的判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值