gpt4 book ai didi

c - 为什么当我使用 copy_from_user 时,一些模糊字符添加到原始缓冲区?

转载 作者:行者123 更新时间:2023-12-02 21:44:39 25 4
gpt4 key购买 nike

我在内核模块中创建了 WRITE_IOCTL 并在用户模式下调用它:

ioctl(fd, WRITE_IOCTL, "Hello, Kernel!");

在内核模式下我有:

static int device_ioctl(struct file *filp,
unsigned int cmd, unsigned long args) {
char buff[14];

switch (cmd) {
case WRITE_IOCTL:
copy_from_user( buff,(char *)args, 14);
printk("This message received from User Space: %s\n", buff);
break;
}
return 0;
}

当我运行这个 ioctl 时,我在/var/log/kern.log 中有一些类似的内容:

This message received from User Space: Hello, Kernel!vE�
This message received from User Space: Hello, Kernel!M�
This message received from User Space: Hello, Kernel!M�

如何解决这个问题?

最佳答案

可能 copy_from_user() 没有放置空字节终止符,因为 args 大于或等于您的 n 并且printk() 需要一个以 null 结尾的值,因此您正在访问垃圾值。为了解决这个问题,请将自己的 buf 初始化为零:

  char buff[14 + 1] = {0}; // +1 for make room to 0-byte-terminattor.

它将用零填充 buf 的所有字节。

编辑:

正如 @caf 在评论中提到的,您需要为空字节终止符留出一些空间。因此,不要准确地给出函数的缓冲区大小,而是将其传递为 n-1,以便函数将循环到 n,然后放入空字节。

关于c - 为什么当我使用 copy_from_user 时,一些模糊字符添加到原始缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com