From 2e42d32407165f437549abddd319f8feab0051d6 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 5 Oct 2025 19:13:44 -0400 Subject: kern: os: Add copyinstr() Signed-off-by: Ian Moffett --- src/sys/include/os/systm.h | 12 ++++++++++++ src/sys/os/os_systm.c | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/sys/include/os/systm.h b/src/sys/include/os/systm.h index 33de08a..24f21db 100644 --- a/src/sys/include/os/systm.h +++ b/src/sys/include/os/systm.h @@ -32,6 +32,18 @@ #include +/* + * Copy userland string to kernel space safely + * + * @uaddr: Userspace source address to copy from + * @kaddr: Kernel address dest address to copy to + * @len: Length of buffer + * + * Returns 0 on success, otherwise a less than zero value + * on failure. + */ +int copyinstr(const void *uaddr, char *kaddr, size_t len); + /* * Copy userland data to kernel space safely * diff --git a/src/sys/os/os_systm.c b/src/sys/os/os_systm.c index f7fd8f1..69fab30 100644 --- a/src/sys/os/os_systm.c +++ b/src/sys/os/os_systm.c @@ -91,3 +91,29 @@ copyout(const void *kaddr, void *uaddr, size_t len) memcpy(uaddr, kaddr, len); return 0; } + +int +copyinstr(const void *uaddr, char *kaddr, size_t len) +{ + char *dest = (char *)kaddr; + const char *src = (char *)uaddr; + char dmmy; + + if (copyin(uaddr, &dmmy, 1) != 0) { + return -EFAULT; + } + + for (size_t i = 0; i < len; ++i) { + if (copyin(uaddr + i, &dmmy, 1) != 0) { + return -EFAULT; + } + + dest[i] = src[i]; + + if (src[i] == '\0') { + break; + } + } + + return 0; +} -- cgit v1.2.3