蜗窝科技

【微信群技术讨论】strncpy_from_user如果copy内核字符串会怎样?

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 linuxer · 2017-08-04 · 1 帖

本文是原「蜗窝讨论区」的历史存档(2017-08-04),来自版块「Linux kernel技术问答」,共 1 帖。讨论区已停止服务,此处仅供查阅。

linuxer · 2017-08-04 08:38

请问,strncpy_from_user(char dst, const char __user src, long count)从用户空间复制字符串到内核缓冲区,如果这个src指针指向内核空间的一个字符串,那么这个函数还能正常执行吗?

为什么这么问呢?因为在内核代码中,kernel_init_freeable里面调用sys_open((const char __user*) "/dev/console", O_RDWR, 0),这个/dev/console字符串就是编译进内核映像,src指针应该就是指向内核空间的一个地址,这里的调度不会有问题吗?

回答:Strncpy_from_user会检查src是否超过地址空间的上限(struct thread_info 中的addr_limit),对于用户空间进程,这个addr_limit就是用户空间的上限,对于ARM,这个极限值是TASK_SIZE(3G),对于ARM64,这个极限值是(UL(1) << VA_BITS),对于内核线程,这个addr_limit就是整个地址空间的上限,也就是说,在内核态可以访问所有的地址空间(内核空间+用户地址空间)