免费注册 查看新帖 |

Chinaunix

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

vfs无法拦截以O_TRUNC方式open文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-07 09:55 |只看该作者 |倒序浏览
现在在做一个虚拟文件系统下的一个试验,通过hook file->f_op->open对文件的读取操作进行拦截,但是发现当对以O_TRUNC方式open文件时,执行到file->f_op->open的时候,文件中数据已经被清空了。请问各位怎么回事?
读取文件实际上是通过filp_open来完成的,最后调用 file->f_op->open是在dentry_open中;分析发现对文件的截断操作应该是在open_namei中完成(最后调用do_truncate),但是不知道如何才能有效的对文件的O_TRUNC方式open进行有效拦截处理,大家帮忙!!
753struct file *filp_open(const char * filename, int flags, int mode)
754{
755        int namei_flags, error;
756        struct nameidata nd;
757
758        namei_flags = flags;
759        if ((namei_flags+1) & O_ACCMODE)
760                namei_flags++;
761        if (namei_flags & O_TRUNC)
762                namei_flags |= 2;
763
764        error = open_namei(filename, namei_flags, mode, &nd);
765        if (!error)
766                return dentry_open(nd.dentry, nd.mnt, flags);
767
768        return ERR_PTR(error);
769}

[ 本帖最后由 canjian 于 2009-4-7 10:13 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-07 11:14 |只看该作者
你是说在执行filp_open()之前,文件就被清空了?
这似乎不可能吧。

论坛徽章:
0
3 [报告]
发表于 2009-04-07 11:46 |只看该作者

回复 #2 richardhesidu 的帖子

可能我没有说清楚吧,是dentry_open(nd.dentry, nd.mnt, flags)之前文件完成截断操作的;截断操作是在 open_namei中完成。
     我又hook了set_attr和truncate,但是open_namei在执行的时候并调用这两个函数,貌似直接操作了映射内存空间来完成截断的,这样有什么办法能有效对O_TRUNC进行处理呢?

论坛徽章:
0
4 [报告]
发表于 2009-04-07 14:48 |只看该作者
不知道你的内核版本是多少。
从2.6.28.7来看,在调用file->f_op->open之前,已经调用了do_truncate。
所以劫持file->f_op->open函数,并不能拦截do_truncate。
我觉得这里得直接截获系统调用表才行。

论坛徽章:
0
5 [报告]
发表于 2009-04-07 20:17 |只看该作者

回复 #4 richardhesidu 的帖子

以前是利用截获系统调用表来做的,但是利用系统调用表的话在64位下面只要一引用到调用表中的地址,就出现死机,包括printk打印在内。有谁知道如何解决呢?
另外,利用系统调用表来实现时,利用vsftpd这个ftp服务器时,sys_getcwd得到的总是“/”,而不是proc文件该进程对应的cwd,这个又是为什么呢?

[ 本帖最后由 canjian 于 2009-4-7 22:59 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-04-08 08:40 |只看该作者
原帖由 canjian 于 2009-4-7 20:17 发表
以前是利用截获系统调用表来做的,但是利用系统调用表的话在64位下面只要一引用到调用表中的地址,就出现死机,包括printk打印在内。有谁知道如何解决呢?
另外,利用系统调用表来实现时,利用vsftpd这个ftp服 ...

截获系统调用表的方法有好几种,不知道你用的是那种。

论坛徽章:
0
7 [报告]
发表于 2009-04-08 11:22 |只看该作者

回复 #6 richardhesidu 的帖子

http://www.unixresources.net/lin ... 0/63/84/638448.html
上网网址中采用的方法,但是只要一引用就死机!

请问还有什么更好的方法吗?

论坛徽章:
0
8 [报告]
发表于 2009-04-08 12:05 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP