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

Reply via email to