连接跟踪扩展数据问题修改

连接跟踪扩展数据问题修改

内核版本:4.14
问题分析描述:
首先看一下连接跟踪扩展数据添加的代码。在连接跟踪上添加扩展数据的时候会调用nf_ct_ext_add函数。如下代码所示,在第一次添加扩展数据时,会首先分配扩展数据内存,指定扩展数据最小为128字节。后续如果在连接上继续添加很多其他的扩展数据结构,导致扩展数据的实际大小超过了128字节,就会调用realloc去根据新扩展数据的大小重新分配扩展数据的内存,并将原扩展数据内容copy到新内存。
对应代码如下:
在这里插入图片描述
但是,如下面的数据结构图所示,struct nf_conn_help是多连接添加的扩展数据,expectations是struct nf_conn_help中的一员,是所属连接的期待链表头,下面挂载着各个多连接期待表项节点exp1,exp2等。此时exp1的prev是指向期待连接表头的。如果扩展数据内存被重新分配,expectations链表头也会变为新的地址expectations_new,但是原来多连接扩展数据的第一个节点exp1指向表头的pprev指针并没有改变,还是依旧指向原来的expectation地址。(exp的老化释放通过两种方式同时进行,一种是根据老化时间定时老化,另一种是连接删除时候进行摘链释放)这就导致了在触发exp1删除时,移除或者释放exp1后还可以通过遍历当前连接的expectation_new链表继续查找到exp1,引起了一系列期待连接相关的内存访问错误堆栈问题。

连接扩展数据结构组织形式如下ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值