# bad address, userland kerneland transition problem



## eyebone (May 13, 2010)

i have written a simple module which is calling the function kern_stat() which is defined in /usr/src/sys/kern/vfs_syscalls.c

the call looks like:

```
error = kern_stat(td, uap->path, UIO_USERSPACE, &sb);
```

now, uap->path is the path to the thing which shall be stat'ed, td is the struct thread(the current thread which is calling) and sb is a stat buf which was allocated before, to save the results and copy it later back to userland(i dont know what UIO_USERSPACE is doing).

luckily this call works perfectly fine in syscall stat, as it was build for that and got the correct arguments delivered, but i try to use this outside of a function which can deliver me arguments from the userland side. my adjusted code is like:


```
error = kern_stat(td, kernel_path, UIO_USERSPACE, &sb);
```
kernel_path is: /bin/ls

i get a return code of 14(EFAULT) (/usr/include/sys/errno.h) which is for bad address. i assume that the problem here is that i defined kernel_path in kerneland but the address has to be from userspace. now, simply how can i decide to test for something on such a function when it is waiting for an address from userland? 
i would like to implement such without complex design like a special userland daemon which passes the arguments to the module ... would be at least nice 

thank your for the help,


----------



## eyebone (May 13, 2010)

ok 

rtfm, now, having a look into /usr/src/sys/uio.h pretty much solves the issue.


```
/* Segment flag values. */
enum uio_seg {
        UIO_USERSPACE,          /* from user data space */
        UIO_SYSSPACE,           /* from system space */
        UIO_NOCOPY              /* don't copy, already in object */
};
```

so, to use in my case i have to use UIO_SYSSPACE  :stud


----------

