【问题标题】:Why when I use copy_from_user, some vague character added to original buffer?为什么当我使用 copy_from_user 时,原始缓冲区中添加了一些模糊字符?
【发布时间】:2013-11-13 17:28:44
【问题描述】:

我在内核模块中创建了 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�

我该如何解决这个问题??

【问题讨论】:

    标签: c linux-kernel kernel linux-device-driver kernel-module


    【解决方案1】:

    可能copy_from_user() 没有放置空字节终止符,因为args 大于或等于您的nprintk() 期待一个空终止符,所以您正在访问垃圾价值观。为了解决这个问题,请将自己的 buf 初始化为零:

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

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

    编辑:

    正如 cmets 中提到的@caf,您需要为空字节终止符留出一些空间。因此,与其给出函数的确切缓冲区大小,不如将它传递给 n-1,这样函数就会循环 untl n,然后放入空字节。

    【讨论】:

    • 太棒了。谢谢@面具
    • 很高兴为您提供帮助! @Khajavi
    • @Khajavi:请注意,您还需要将缓冲区扩大到[15],以便为空终止符腾出空间。
    • @caf:嗯,我修好了。
    猜你喜欢
    • 2021-12-06
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多