Module Name: src Committed By: chs Date: Mon May 28 21:04:42 UTC 2018
Modified Files: src/sys/kern: subr_copy.c src/sys/sys: systm.h Log Message: add copyin_pid(), to copyin from a different user address space. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/kern/subr_copy.c cvs rdiff -u -r1.275 -r1.276 src/sys/sys/systm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_copy.c diff -u src/sys/kern/subr_copy.c:1.7 src/sys/kern/subr_copy.c:1.8 --- src/sys/kern/subr_copy.c:1.7 Wed May 25 17:43:58 2016 +++ src/sys/kern/subr_copy.c Mon May 28 21:04:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_copy.c,v 1.7 2016/05/25 17:43:58 christos Exp $ */ +/* $NetBSD: subr_copy.c,v 1.8 2018/05/28 21:04:41 chs Exp $ */ /*- * Copyright (c) 1997, 1998, 1999, 2002, 2007, 2008 The NetBSD Foundation, Inc. @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_copy.c,v 1.7 2016/05/25 17:43:58 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_copy.c,v 1.8 2018/05/28 21:04:41 chs Exp $"); #include <sys/param.h> #include <sys/fcntl.h> @@ -300,6 +300,33 @@ copyout_proc(struct proc *p, const void } /* + * Like copyin(), but operates on an arbitrary pid. + */ +int +copyin_pid(pid_t pid, const void *uaddr, void *kaddr, size_t len) +{ + struct proc *p; + struct vmspace *vm; + int error; + + mutex_enter(proc_lock); + p = proc_find(pid); + if (p == NULL) { + mutex_exit(proc_lock); + return ESRCH; + } + mutex_enter(p->p_lock); + proc_vmspace_getref(p, &vm); + mutex_exit(p->p_lock); + mutex_exit(proc_lock); + + error = copyin_vmspace(vm, uaddr, kaddr, len); + + uvmspace_free(vm); + return error; +} + +/* * Like copyin(), except it operates on kernel addresses when the FKIOCTL * flag is passed in `ioctlflags' from the ioctl call. */ Index: src/sys/sys/systm.h diff -u src/sys/sys/systm.h:1.275 src/sys/sys/systm.h:1.276 --- src/sys/sys/systm.h:1.275 Sun Feb 4 17:31:51 2018 +++ src/sys/sys/systm.h Mon May 28 21:04:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: systm.h,v 1.275 2018/02/04 17:31:51 maxv Exp $ */ +/* $NetBSD: systm.h,v 1.276 2018/05/28 21:04:41 chs Exp $ */ /*- * Copyright (c) 1982, 1988, 1991, 1993 @@ -267,6 +267,7 @@ typedef int (*copyout_t)(const void *, v int copyin_proc(struct proc *, const void *, void *, size_t); int copyout_proc(struct proc *, const void *, void *, size_t); +int copyin_pid(pid_t, const void *, void *, size_t); int copyin_vmspace(struct vmspace *, const void *, void *, size_t); int copyout_vmspace(struct vmspace *, const void *, void *, size_t);