copy_from_user正在获取意外数据

时间:2016-06-03 17:17:51

标签: linux-kernel system-calls

我想使用write sycall来复制struct 从用户空间到内核 在用户和内核空间中,结构定义为

struct packet{
    unsigned char packet[256];
    int length;
}__attribute__ ((packed));

用户空间使用struct packet类型的局部变量并将其传递给write syscall。

struct packet p;
/* ... (fill in data)  */
printf("packet.length: %d\n",packet.length); /* looks correct */
result = write(uartFD, &p, sizeof(struct packet));

内核端看起来像这样,检查正确的长度,只是从示例中删除。

/* write syscall */
ssize_t packet_write(
    struct file *file_ptr,
    const char __user *user_buffer,
    size_t count, loff_t *position)
{

struct packet p;
int retval;

if (copy_from_user((void*)&p, user_buffer, sizeof(struct packet))){
    retval = -EACCES;
    goto err;
}

/* looks wrong - different numbers like 96373062 or 96373958 */
printk("packet length: %d\n",p.length); 

使用read sycall的相反方向正如预期的那样工作:

 /* read syscall */
struct packet p;
/* ... (fill in data)  */
copy_to_user(user_buffer, (void*)&p, sizeof(struct packet));
/* userspace */
read(uartFD, (void*)&packet, sizeof(struct packet));

写syscall我做错了什么?

1 个答案:

答案 0 :(得分:0)

(代表OP发布)

这已经解决了 - 这是我自己的愚蠢。分别复制一个整数和一个unsigned char缓冲区都有效,所以它必须是关于struct的东西。

一个网站被打包,另一个网站没有......重用旧代码......