summaryrefslogtreecommitdiff
path: root/sys/contrib/lomac/kernel_pipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/lomac/kernel_pipe.c')
-rw-r--r--sys/contrib/lomac/kernel_pipe.c235
1 files changed, 0 insertions, 235 deletions
diff --git a/sys/contrib/lomac/kernel_pipe.c b/sys/contrib/lomac/kernel_pipe.c
deleted file mode 100644
index c85b0cabc4a14..0000000000000
--- a/sys/contrib/lomac/kernel_pipe.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*************************************************************************
- *
- * kernel_pipe.c
- *
- * LOMAC - Low Water-Mark Mandatory Access Control
- * Copyright (c) 1999-2001 Networks Associates, Inc. All rights reserved.
- *
- * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of NAI Labs, Inc. nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- *
- * This file contains part of LOMAC's interface to the kernel. This
- * part allows LOMAC to monitor (unnamed) pipe read and write
- * operations by interposing control on the kernel's pipeops vector.
- *
- * The pipeops vector is defined in kern/sys_pipe.c.
- *
- * USAGE:
- *
- * The LOMAC LKM should call lomac_initialize_pipes() at LKM load time.
- * This function turns unnamed pipe interposition on by modifying
- * the function addresses in pipeops.
- *
- * Once the LOMAC LKM turns interposition on, all reads and writes
- * will pass through this file's monitoring functions.
- *
- * This file provides a lomac_uninitialize_pipes() function which
- * turns unnamed pipe interposition off by restoring pipeops to
- * its original unmodified state. Once the LOMAC LKM turns
- * interposition off, subsequent unnamed pipe reads and writes
- * will not pass through this file's monitoring functions.
- *
- * HOW LOMAC HANDLES PIPES:
- *
- * (This text describes how LOMAC handles (unnamed) pipes in terms of
- * abstract architecture-independent concepts.) LOMAC does not treat
- * pipes as objects, as it does files. When the kernel creates a new
- * pipe, LOMAC assigns it the highest level. Whenever a process
- * writes to the pipe, LOMAC reduces the pipe's level to match the
- * level of the writing process. Whenever a process reads from a
- * pipe, LOMAC reduces the level of the reading process to match the
- * pipe's level. As a result, if a high-level process reads the
- * output of a low-level process through a pipe, the reading process
- * will wind up at the low level.
- *
- * It takes two `struct pipe's to make a pipe. We set the level
- * information in both `struct pipes', and keep them synchronized.
- *
- * This code presently relies on the one-big-kernel-lock to
- * synchronize its access to the `pipe_state' field of each `struct
- * pipe'.
- *
- */
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/file.h>
-#include <sys/selinfo.h>
-#include <sys/pipe.h>
-#include <sys/proc.h>
-#include <sys/uio.h>
-
-#include "lomac.h"
-#include "kernel_interface.h"
-#include "kernel_monitor.h"
-#include "kernel_pipe.h"
-
-
-/* `pipeops' is the kernel's pipe operations vector for the file *
- * structure. All reads and writes to pipes call through this vector. */
-extern struct fileops pipeops; /* defined in kern/sys_pipe.c */
-
-
-/* These vars store the original addresses of the pipeops read and *
- * write operations, so we can call them, and even restore them *
- * later if we want to. */
-static int (*pipe_read_orig)(struct file *, struct uio *, struct ucred *,
- int, struct thread *);
-static int (*pipe_write_orig)(struct file *, struct uio *, struct ucred *,
- int, struct thread *);
-
-
-/* declarations of functions private to this module: */
-static int lomac_pipe_read(struct file *, struct uio *, struct ucred *,
- int, struct thread *);
-static int lomac_pipe_write(struct file *, struct uio *, struct ucred *,
- int, struct thread *);
-
-/* -------------------- public functions ---------------------------- */
-
-/* lomac_initialize_pipes()
- *
- * in: nothing
- * out: nothing
- * return: 0
- *
- * Turns pipe interposition on by replacing the pipe_read() and pipe_write()
- * operations in the kernel's pipeops vector with lomac_pipe_read() and
- * lomac_pipe_write(). Saves the addresses of the original operations
- * so other functions can call them, and so pipe_interposition_off()
- * can restore the pipeops vector to its original unmodified state.
- *
- */
-
-int
-lomac_initialize_pipes(void) {
-
- pipe_read_orig = pipeops.fo_read;
- pipeops.fo_read = lomac_pipe_read;
- pipe_write_orig = pipeops.fo_write;
- pipeops.fo_write = lomac_pipe_write;
- return (0);
-} /* lomac_initialize_pipes() */
-
-
-/* lomac_uninitialize_pipes()
- *
- * in: nothing
- * out: nothing
- * return: 0
- *
- * Turns pipe interposition off by restoring the pipeops vector to its
- * original unmodified state.
- *
- * See note at top of file regarding this function and unloading the
- * LOMAC LKM.
- *
- */
-
-int
-lomac_uninitialize_pipes(void) {
-
- KASSERT(pipe_read_orig, ("LOMAC:pipe interpositon off before on"));
- KASSERT(pipe_write_orig, ("LOMAC:pipe interpositon off before on"));
- pipeops.fo_read = pipe_read_orig;
- pipeops.fo_write = pipe_write_orig;
- return (0);
-} /* lomac_uninitialize_pipes() */
-
-
-
-/* ------------------- private functions --------------------------- */
-
-#ifndef MIN
-#define MIN(lo, mac) ((lo) < (mac) ? (lo) : (mac))
-#endif
-
-/* lomac_pipe_read()
- *
- * Passes the read operation down to pipe_read_orig(). If
- * pipe_read_orig() returns success, examines the level of the pipe
- * and the reading process. If the reading process has a higher
- * level, reduces the level of the process to equal the pipe's level.
- *
- */
-
-static int
-lomac_pipe_read(struct file *fp, struct uio *uio, struct ucred *cred,
- int flags, struct thread *td) {
- lomac_object_t read_pipe; /* attrs are in read end of pipe */
- struct uio kuio;
- struct iovec kiov;
- void *buf;
- int len;
- int ret_val; /* holds return values */
-
- len = MIN(uio->uio_resid, BIG_PIPE_SIZE);
- kiov.iov_base = buf = malloc(len, M_TEMP, M_WAITOK);
- kiov.iov_len = len;
- kuio.uio_iov = &kiov;
- kuio.uio_iovcnt = 1;
- kuio.uio_offset = 0;
- kuio.uio_resid = len;
- kuio.uio_segflg = UIO_SYSSPACE;
- kuio.uio_rw = UIO_READ;
- kuio.uio_td = td;
- ret_val = pipe_read_orig(fp, &kuio, cred, flags, td);
- if (ret_val == 0) {
- read_pipe.lo_type = LO_TYPE_PIPE;
- read_pipe.lo_object.pipe = (struct pipe *)fp->f_data;
- (void)monitor_read_object(td->td_proc, &read_pipe);
- ret_val = uiomove(buf, len - kuio.uio_resid, uio);
- }
- free(buf, M_TEMP);
- return (ret_val);
-} /* lomac_pipe_read() */
-
-
-/* lomac_pipe_write()
- *
- * Passes the write operation down to pipe_write_orig(). If
- * pipe_write_orig() returns success, examines the level of the pipe
- * and the writing process. If the pipe has a higher level than the
- * writing process, this function reduces the pipe's level to equal
- * the level of the writing process.
- *
- */
-
-static int
-lomac_pipe_write(struct file *fp, struct uio *uio, struct ucred *cred,
- int flags, struct thread *td) {
- lomac_object_t pipe;
- int ret_val; /* holds return values */
-
- pipe.lo_type = LO_TYPE_PIPE;
- pipe.lo_object.pipe = (struct pipe *)fp->f_data;
- ret_val = monitor_pipe_write(td->td_proc, &pipe);
- if (ret_val == 0)
- ret_val = pipe_write_orig(fp, uio, cred, flags, td);
-
- return (ret_val);
-} /* lomac_pipe_write() */