如何使用copy_from_user?

时间:2011-05-28 15:44:13

标签: c linux linux-kernel shared-libraries

ssize_t probchar_write(struct file *filp, 
    const char __user *data, size_t s, loff_t *off) {

    printk(KERN_DEBUG "Data> |%s|\n", data); // only for debug
    char chars[MAX_LENGHT];
    if(s > MAX_LENGHT)
        s = MAX_LENGHT;
    if (copy_from_user(chars, data, s)) {
        return -EFAULT;
    }
    printk(KERN_DEBUG "Chars> |%s|\n", chars);
    return s;
}

这是dmesg输出

[66777.956582] Data> |45
[66777.956596] |
[66777.956634] Chars> |45
[66777.956636] �    Ҩ�H��   H�� |

为什么复制的链最后会有更多字符?

2 个答案:

答案 0 :(得分:2)

这似乎是设备驱动程序的写入功能。

第一

printk(KERN_DEBUG "Data> |%s|\n", data);

不要这样做!永远不要直接访问用户数据!

<击>第二

<击>
char chars[s];

我怀疑这是合法的C.你需要在编译时指定一个大小,或者使用kmalloc。

copy_from_user用法很好。您应检查错误并返回-EFAULT。没关系。

所以只需尝试分配字符就可以了。您可能还想查看偏移量,但最初可以跳过学术目的。

答案 1 :(得分:0)

假设以下内容:在提供的字符串末尾没有\0。您不添加一个或强制执行一个。然后在复制包含随机垃圾的堆栈分配缓冲区上的“有效”数据后打印字符串。这会打印出额外的字符。

建议检查:分配MAX_LENGTH + 1个字符,复制数据后,执行chars[s]=0。 您可能还想删除那个会导致日志格式化的\n字符。