diff options
-rw-r--r-- | src/sys/include/os/systm.h | 12 | ||||
-rw-r--r-- | src/sys/os/os_systm.c | 10 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/sys/include/os/systm.h b/src/sys/include/os/systm.h index 24f21db..4cb526e 100644 --- a/src/sys/include/os/systm.h +++ b/src/sys/include/os/systm.h @@ -68,4 +68,16 @@ int copyin(const void *uaddr, void *kaddr, size_t len); */ int copyout(const void *kaddr, void *uaddr, size_t len); +/* + * Copy kernel string to userland safely + * + * @kaddr: Kernel space address to copy from + * @uaddr: User space address to copy to + * @len: Length of bytes to copy + * + * Returns zero on success, otherwise a less than + * zero value. + */ +int copyoutstr(const void *kaddr, void *addr, size_t len); + #endif /* !_OS_SYSTM_H_ */ diff --git a/src/sys/os/os_systm.c b/src/sys/os/os_systm.c index 69fab30..0e28372 100644 --- a/src/sys/os/os_systm.c +++ b/src/sys/os/os_systm.c @@ -117,3 +117,13 @@ copyinstr(const void *uaddr, char *kaddr, size_t len) return 0; } + +int +copyoutstr(const void *kaddr, void *addr, size_t len) +{ + size_t slen; + + slen = strlen(kaddr); + len = MIN(slen, len); + return copyout(kaddr, addr, len); +} |