summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>1999-06-07 07:17:42 +0000
committerderaadt <deraadt@openbsd.org>1999-06-07 07:17:42 +0000
commite7ff0a25cbfd4ef2bf92cef421fe2c17b0e446fa (patch)
treeed7e1f089e65c664cb99db4f0d04dd79f44ecd5e /sys/kern
parentFix address typos in the example (markc@) (diff)
downloadwireguard-openbsd-e7ff0a25cbfd4ef2bf92cef421fe2c17b0e446fa.tar.xz
wireguard-openbsd-e7ff0a25cbfd4ef2bf92cef421fe2c17b0e446fa.zip
replacement pipe() system call; copies data into place inside kernel, so
that EFAULT return value is possible
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/sys_pipe.c4
-rw-r--r--sys/kern/syscalls.master5
-rw-r--r--sys/kern/uipc_syscalls.c30
3 files changed, 33 insertions, 6 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index ebc661bb095..f14e55a005f 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_pipe.c,v 1.12 1999/06/07 01:41:01 deraadt Exp $ */
+/* $OpenBSD: sys_pipe.c,v 1.13 1999/06/07 07:17:42 deraadt Exp $ */
/*
* Copyright (c) 1996 John S. Dyson
@@ -156,7 +156,7 @@ int
#if defined(__FreeBSD__)
pipe(p, uap, retval)
#else /* (__NetBSD__) || (__OpenBSD__) */
-sys_pipe(p, v, retval)
+sys_opipe(p, v, retval)
#endif
struct proc *p;
void *v;
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 58e865bef0f..f3bbc850c38 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -1,4 +1,4 @@
-; $OpenBSD: syscalls.master,v 1.36 1999/05/31 17:34:47 millert Exp $
+; $OpenBSD: syscalls.master,v 1.37 1999/06/07 07:17:42 deraadt Exp $
; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@@ -107,7 +107,7 @@
40 COMPAT_43 { int sys_lstat(char *path, \
struct ostat *ub); } olstat
41 STD { int sys_dup(int fd); }
-42 STD { int sys_pipe(void); }
+42 STD { int sys_opipe(void); }
43 STD { gid_t sys_getegid(void); }
44 STD { int sys_profil(caddr_t samples, size_t size, \
u_long offset, u_int scale); }
@@ -519,3 +519,4 @@
261 STD { int sys_statfs(const char *path, \
struct statfs *buf); }
262 STD { int sys_fstatfs(int fd, struct statfs *buf); }
+263 STD { int sys_pipe(int *fdp); }
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index cff7ebce68b..99a511eaf34 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_syscalls.c,v 1.21 1999/06/07 01:40:01 deraadt Exp $ */
+/* $OpenBSD: uipc_syscalls.c,v 1.22 1999/06/07 07:17:42 deraadt Exp $ */
/* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */
/*
@@ -835,10 +835,36 @@ sys_getsockopt(p, v, retval)
return (error);
}
+int
+sys_pipe(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct filedesc *fdp = p->p_fd;
+ register struct sys_pipe_args /* {
+ syscallarg(int *) fdp;
+ } */ *uap = v;
+ int error;
+
+ if ((error = sys_opipe(p, v, retval)) == -1)
+ return (error);
+
+ error = copyout((caddr_t)retval, (caddr_t)SCARG(uap, fdp),
+ 2 * sizeof (int));
+ if (error) {
+ ffree(fdp->fd_ofiles[retval[0]]);
+ fdp->fd_ofiles[retval[0]] = NULL;
+ ffree(fdp->fd_ofiles[retval[1]]);
+ fdp->fd_ofiles[retval[1]] = NULL;
+ }
+ return (error);
+}
+
#ifdef OLD_PIPE
/* ARGSUSED */
int
-sys_pipe(p, v, retval)
+sys_opipe(p, v, retval)
struct proc *p;
void *v;
register_t *retval;