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�� |
为什么复制的链最后会有更多字符?
答案 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
字符。