网络、内存以及莫名其妙的问题

这个问题很奇怪,在测试只是用PROTOCOL_RDP进行加密通信的过程中,程序莫名其妙的崩溃了。
崩溃不可怕,只要可以重现就知道崩溃点在哪里,还是很好解决的。
最后定位到的原因是,在进行RC4的密钥交换时,无法Decode Server的Certificate,从而造成没法把ClientRandom用Server的Public Key加密之后发给Server。最后整个RDP的流程就在这里停止了。
至于为什么崩溃,是直到这个问题解决的时候才明白的,反正就是在读取Certificate的时候用到的一块malloc出来的内存,在最后程序的退出free的时候,莫名其妙的崩溃了。
解决方法很笨拙,就是把MSTSC和FreeRDP的连接的包都抓下来一点点的对比。
总结一下吧,为了和标题对上我们就按标题顺序来描述这个问题:

  • 在原来的网络层(当然不是我写的了)Recv的时候使用了固定大小的内存。原先想当然的用了4096这个大小。在XP上测试的时候一点问题没有,因为XP的证书不是X509格式的,所以很小,才200 Bytes左右。而在2008上测试时就有问题了,内存不够用了。一般发过来的证书都要将近5000 bytes
  • 那么网络层Recv的数据超过了固定内存的大小就导致有一部分的数据写到了这个数组之外,这些数据随时可能被其它的代码给覆盖掉。最后将数据送到gcc模块进行解析的时候,大概率这部分被覆盖的数据会导致解析错误。
  • 至于为什么崩溃,因为那部分数据不属于这个动态分配的数据,在free的时候必然引起SegmentFault
  • 这是一个人为的、为了方便的、不顾扩展性的、自以为是的坑。。。。。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 13,184评论 0 11
  • 就成了埋人时的 前奏 有一次 我欢天喜地 放开一首唢呐曲 人们的眼神 就像看到一个 死去多时的人 活了
    勒尤阅读 1,877评论 0 0
  • 父亲慈爱地笑:“天上飞的,地上走的,水里游的,树上结的,你哪样没给我们买过?”八十岁的老父这样知足地记着女儿买的东...
    铭玥咏全阅读 1,436评论 0 1
  • 广州市天河区棠下村 301一个月450 还有别的房间可以看一下吗? 302一个月550 怎么贵100啊 太阳中午的...
    朱克阅读 1,612评论 0 2

友情链接更多精彩内容