From d267fcf7b8c8d53a2d1807570c278cf39727eb16 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 26 Mar 2024 14:51:51 -0400 Subject: kernel: Add copyinstr() routine Signed-off-by: Ian Moffett --- sys/kern/kern_subr.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'sys/kern') diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index dd1a618..d9b1b3a 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/kern_subr.c @@ -93,3 +93,42 @@ copyout(const void *kaddr, uintptr_t uaddr, size_t len) memcpy((void *)uaddr, kaddr, len); return 0; } + +/* + * Copy in a string from userspace + * + * Unlike the typical copyin(), this routine will + * copy until we've hit NUL ('\0') + * + * @uaddr: Userspace address. + * @kaddr: Kernelspace address. + * @len: Length of string. + * + * XXX: Please note that if `len' is less than the actual + * string length, the returned value will not be + * NUL terminated. + */ +int +copyinstr(uintptr_t uaddr, char *kaddr, size_t len) +{ + char *dest = (char *)kaddr; + char *src = (char *)uaddr; + + if (!check_uaddr(uaddr)) { + return -EFAULT; + } + + for (size_t i = 0; i < len; ++i) { + if (!check_uaddr(uaddr + i)) { + return -EFAULT; + } + + dest[i] = src[i]; + + if (src[i] == '\0') { + break; + } + } + + return 0; +} -- cgit v1.2.3