copy_to_user and copy_from_user with structs

为君一笑 提交于 2020-02-05 05:14:29

问题


I have a simple question: when i have to copy a structure's content from userspace to kernel space for example with an ioctl call (or viceversa) (for simplicity code hasn't error check):

typedef struct my_struct{
 int a;
 char b;
} my_struct;

Userspace:

my_struct s;
s.a = 11;
s.b = 'X';

ioctl(fd, MY_CMD, &s);

Kernelspace:

int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
             unsigned long arg)
{
...
    my_struct ks;
    copy_from_user(&ks, (void __user *)arg, sizeof(ks));
...
}

i think that size of structure in userspace (variable s) and kernel space (variable ks) could be not the same (without specify the __attribute__((packed))). So is a right thing specifing the number of byte in copy_from_user with sizeof macro? I see that in kernel sources there are some structures that are not declared as packed so, how is ensured the fact that the size will be the same in userspace and kernelspace?

Thank you all!


回答1:


Why should the layout of a struct be different in kernel space from user space? There is no reason for the compiler to layout data differently. The exception is if userspace is a 32bit program running on a 64bit kernel. See http://www.x86-64.org/pipermail/discuss/2002-June/002614.html for a tutorial how to deal with this.




回答2:


The userspace structure should come from kernel header, so struct definition should be the same in user and kernel space. Do you have any real example ?

Of course, if you play with different packing options on two side of an ABI, whatever it is, you are in trouble. The problem here is not sizeof.

If your question is : does packing options affect binary interface, the answer is yes. If your question is, how can I solve a packing mismatch, please provide more information



来源:https://stackoverflow.com/questions/8457574/copy-to-user-and-copy-from-user-with-structs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!