I've implemented some kind of character device and I need help with copy_ from_user function.
I've a structure:
struct my_struct{
int a;
int *b;
};
I initialize it in user space and pass pointer to my_struct to my char device using 'write' function. In Kernel's Space character device 'write' function I cast it from a *char to this kind of structure. I alloc some memory for a struct using kmalloc and do copy_from_user
into it.
It's fine for simple 'int a', but it copies only pointer (address) of b value, not value pointed by b, so I'm now in Kernel Space and I'm working with a pointer that points to a user space memory. Is this incorrect and I shouldn't access to user space pointer directly and I have to copy_from_user
every single pointer in my struct and then copy back every pointer in "read" function using copy_to_user
function?
You must always use copy_from_user
and similar to access user space memory from kernel space, regardless of how you got the pointer. Since b
is a pointer to user space memory, you must use copy_from_user
to access it.
These functions do two important additional tasks:
copy_*_user
family of functions have a special override that tells the PF handler that all is well, and the fault should be handled normally; and in the event that the fault cannot be satisfied by IO (ie, what would normally cause a SIGSEGV
or SIGBUS
), return an error code instead so their caller can do any necessary cleanup before returning to userspace with -EFAULT
.