summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1999-06-07 07:17:57 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1999-06-07 07:17:57 +0000
commit4e96377228ca04c54bdc4aec8116d85f74e15834 (patch)
tree2bc8d849fde3727add9392d8f2a95f71c02fed16 /sys/kern
parenta7879e1dacba108b617cc911081400e53cca0155 (diff)
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;