免费注册 查看新帖 |

Chinaunix

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

[内核入门] sys_open()拷贝用户传入的文件名问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-24 17:20 |只看该作者 |倒序浏览
  sys_open()中调用到的do_getname()来获取用户传入的文件名:
static int do_getname(const char __user *filename, char *page)
{
        int retval;
        unsigned long len = PATH_MAX;

        if (!segment_eq(get_fs(), KERNEL_DS)) {
                if ((unsigned long) filename >= TASK_SIZE)
                        return -EFAULT;
                if (TASK_SIZE - (unsigned long) filename < PATH_MAX)
                        len = TASK_SIZE - (unsigned long) filename;
        }

        retval = strncpy_from_user(page, filename, len);
        .....
}
为什么会这样len = TASK_SIZE - (unsigned long) filename求文件名的长度,或者直接用PATH_MAX?不是应该用strlen()来获取文件名的长度么?

论坛徽章:
0
2 [报告]
发表于 2013-05-24 18:07 |只看该作者
因为filename是一个用户态的地址,所以直接strlen肯定是不行的。连访问都访问不到,要先拷贝的内核态。
这里的代码我没看过,只看了一下新版本的。
TASK_SIZE应该是检查filename地址是否超出某个界限,如果有的话,就报错。
PATH_MAX用来检查这个字符串的最大长度,(实际上这里是取尽可能的大,而不一定是准确的长度,只是说,filename再长也超不多TASK_SIZE-xxx了,同样,也是边界检查)

应该都是边界检查。不知理解是否正确。
我看的是3.9版本的,大概是这意思

论坛徽章:
0
3 [报告]
发表于 2013-05-25 08:20 |只看该作者
多谢回答,大致意思差不多。不过有一个地方你理解的不对,即使是用户态的地址,内核也可以直接调用strlen()的,我用SystemTap脚本验证过了。PATH_MAX只是一个限制,防止用户传入的字符串不是以空字符结尾。SystemTap脚本如下:
  1. %{
  2. #include <linux/nodemask.h>
  3. %}

  4. function test(arg:long) %{
  5.     char * __user file = (typeof(file))THIS->arg;

  6.     if (!segment_eq(get_fs(), KERNEL_DS)) {
  7.     _stp_printf("file = %s, length = %d.\n", file, strlen(file));
  8.     }
  9. %}

  10. probe begin
  11. {
  12.     printf("Systemtap scripts start......\n");
  13. }

  14. probe kernel.function("sys_open")
  15. {
  16.     test(pointer_arg(1));
  17. }
复制代码
回复 2# remaper


   

论坛徽章:
0
4 [报告]
发表于 2013-05-25 08:21 |只看该作者
将虚拟地址转换为物理地址时,使用页表还是直接映射是由虚拟内存的值来决定的,跟用户态、内核态没有关系,只是一个地址范围的划分回复 2# remaper


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [报告]
发表于 2013-05-26 08:50 |只看该作者
回复 1# justlinux2010

原因是内核不信任用户态指针,如果你传个NULL指针过来内核也strlen,那内核就哭都哭不出来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP