免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1967 | 回复: 4
打印 上一主题 下一主题

[网络子系统] 连接跟踪模块中update_alloc_size函数的问题【已解决】 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-28 23:15 |只看该作者 |倒序浏览
本帖最后由 jiufei19 于 2014-09-29 10:51 编辑

在连接跟踪代码对扩展进行注册时,有如下函数处理

static void update_alloc_size(struct nf_ct_ext_type *type)
{
        int i, j;
        struct nf_ct_ext_type *t1, *t2;
        enum nf_ct_ext_id min = 0, max = NF_CT_EXT_NUM - 1;

        /* unnecessary to update all types */
         if ((type->flags & NF_CT_EXT_F_PREALLOC) == 0) {
                min = type->id;
                max = type->id;
        }

        /* This assumes that extended areas in conntrack for the types
           whose NF_CT_EXT_F_PREALLOC bit set are allocated in order */
        for (i = min; i <= max; i++) {
                t1 = nf_ct_ext_types;
                if (!t1)
                        continue;               
                t1->alloc_size = sizeof(struct nf_ct_ext)
                                 + ALIGN(sizeof(struct nf_ct_ext), t1->align)
                                 + t1->len;

上面红色字体就是我的问题,即这里为什么要多加个sizeof(struct nf_ct_ext)呢?在该函数的上级调用函数nf_ct_extend_register中,已经明明有如下语句了:
          type->alloc_size = ALIGN(sizeof(struct nf_ct_ext),
                                      type->align) + type->len;

PS:

这个问题lunixwh在“论坛›程序设计›C/C++›”中也提出了这一问题,参见“netfilter扩展字段 注册的时候alloc_size 字段问题”,但是没有得到解答

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2014-09-29 00:42 |只看该作者
回复 1# jiufei19


NND,被你害了。
我本身对这NF又不熟。为了回你这个问题,去翻代码,翻得连自己都晕了,还是没能解析。
回头想想,可能真是一个BUG,确认了一下,还真是。F!U!C!K!

社区的提交记录为:
https://git.kernel.org/cgit/linu ... cc0d6a7cfde64307655
10年就发现这个问题了。
diff --git a/net/netfilter/nf_conntrack_extend.c b/net/netfilter/nf_conntrack_extend.c
index bd82450..920f924 100644
--- a/net/netfilter/nf_conntrack_extend.c
+++ b/net/netfilter/nf_conntrack_extend.c
@@ -144,9 +144,8 @@ static void update_alloc_size(struct nf_ct_ext_type *type)
                if (!t1)
                        continue;

-                t1->alloc_size = sizeof(struct nf_ct_ext)
-                                 + ALIGN(sizeof(struct nf_ct_ext), t1->align)
-                                 + t1->len;
+                t1->alloc_size = ALIGN(sizeof(struct nf_ct_ext), t1->align) +
+                                 t1->len;
                for (j = 0; j < NF_CT_EXT_NUM; j++) {
                        t2 = nf_ct_ext_types[j];
                        if (t2 == NULL || t2 == t1 ||


总结:你们公司再这样不跟进社区的补丁迟早把公司和你玩死。
友情提示:最近出了BASH的CVE漏洞,10分的,最高级别!赶紧合补丁,兄弟。


我觉得这个贴你真得感谢一下我,不然不能平复我心中的怨恨。论坛里怎么这么多人问NF的问题,论坛里就没有对NF比较熟的牛ren?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
3 [报告]
发表于 2014-09-29 10:45 |只看该作者
本帖最后由 jiufei19 于 2014-09-29 11:03 编辑
Tinnal 发表于 2014-09-29 00:42
回复 1# jiufei19


真是非常感谢Tinnal的热心,好人一个啊,

说来自己也惭愧,我其实有另外一个高版本的内核源码,居然自己没有想到去对比下究竟怎么回事。

不过顺便问下Tinnal,这种问题你是通过什么方法查到的呢,我的意思是如何在git中去搜到这样的一个关于bug的说明,授我以鱼的时候,能否再授我以渔?

再次万分感谢!

PS:

我试了下,是否就是在该git网站上的“log msg”的Search对话框中输入自己要查找的关键字,比如我输入"update_alloc_size",于是就可以查到了这个bug的相关说明,Tinnal就是这样操作的吗?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-09-29 14:11 |只看该作者
嗯,这样也可以。其实当时我是看了整个文件的changelog

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
5 [报告]
发表于 2014-09-29 20:34 |只看该作者
回复 4# Tinnal


    再次感谢Tinnal!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP