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);