PERFORCE change 17585 for review
Robert Watson
rwatson at freebsd.org
Mon Sep 16 20:10:00 GMT 2002
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=17585
Change 17585 by rwatson at rwatson_tislabs on 2002/09/16 13:09:17
Re-work pipes and locking a bit for the MAC framework:
(1) In any MAC check call for the pipe code, assert that
the pipe mutex is held. We use the pipe mutex to protect
the label when the pipe is active, so it must be held
if we want consistent access to the labe.
(2) Check the mac_enforce_pipe flag for all pipe access
control checks. This permits a high-level disabling
of pipe access control in the MAC framework.
(3) In the pipe code, there were some situations where
the pipe mutex was not held (pipe_stat()) but we required
it to be held. If we need it but the code didn't have it,
grab and release the mutex in the MAC-specific code.
(4) Rather than selectively grabbing the pipe mutex depending
on the ioctl used on a pipe, always grab it, then release
it if not needed. This is required for the MAC ioctl
check. Note: it's not clear to me that all the existing
code here is correct with regards to the locking of the
pipe_sigio pointer, but if it's wrong, it was broken before
I got here. I'm particularly concerned about the call to
fgetown() in TIOCGPGRP, where we pass the sigio pointer
by value rather than by reference.
Affected files ...
.. //depot/projects/trustedbsd/mac/sys/kern/kern_mac.c#263 edit
.. //depot/projects/trustedbsd/mac/sys/kern/sys_pipe.c#31 edit
Differences ...
==== //depot/projects/trustedbsd/mac/sys/kern/kern_mac.c#263 (text+ko) ====
@@ -2613,6 +2613,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_ioctl, cred, pipe, pipe->pipe_label, cmd, data);
return (error);
@@ -2623,6 +2628,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_poll, cred, pipe, pipe->pipe_label);
return (error);
@@ -2633,6 +2643,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_read, cred, pipe, pipe->pipe_label);
return (error);
@@ -2644,6 +2659,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_relabel, cred, pipe, pipe->pipe_label, newlabel);
return (error);
@@ -2654,6 +2674,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_stat, cred, pipe, pipe->pipe_label);
return (error);
@@ -2664,6 +2689,11 @@
{
int error;
+ PIPE_LOCK_ASSERT(pipe, MA_OWNED);
+
+ if (!mac_enforce_pipe)
+ return (0);
+
MAC_CHECK(check_pipe_write, cred, pipe, pipe->pipe_label);
return (error);
==== //depot/projects/trustedbsd/mac/sys/kern/sys_pipe.c#31 (text+ko) ====
@@ -1165,8 +1165,11 @@
struct pipe *mpipe = (struct pipe *)fp->f_data;
#ifdef MAC
int error;
+#endif
+
+ PIPE_LOCK(mpipe);
- /* XXXMAC: Pipe should be locked for this check. */
+#ifdef MAC
error = mac_check_pipe_ioctl(active_cred, mpipe, cmd, data);
if (error)
return (error);
@@ -1175,10 +1178,10 @@
switch (cmd) {
case FIONBIO:
+ PIPE_UNLOCK(mpipe);
return (0);
case FIOASYNC:
- PIPE_LOCK(mpipe);
if (*(int *)data) {
mpipe->pipe_state |= PIPE_ASYNC;
} else {
@@ -1188,7 +1191,6 @@
return (0);
case FIONREAD:
- PIPE_LOCK(mpipe);
if (mpipe->pipe_state & PIPE_DIRECTW)
*(int *)data = mpipe->pipe_map.cnt;
else
@@ -1197,22 +1199,27 @@
return (0);
case FIOSETOWN:
+ PIPE_UNLOCK(mpipe);
return (fsetown(*(int *)data, &mpipe->pipe_sigio));
case FIOGETOWN:
+ PIPE_UNLOCK(mpipe);
*(int *)data = fgetown(mpipe->pipe_sigio);
return (0);
/* This is deprecated, FIOSETOWN should be used instead. */
case TIOCSPGRP:
+ PIPE_UNLOCK(mpipe);
return (fsetown(-(*(int *)data), &mpipe->pipe_sigio));
/* This is deprecated, FIOGETOWN should be used instead. */
case TIOCGPGRP:
+ PIPE_UNLOCK(mpipe);
*(int *)data = -fgetown(mpipe->pipe_sigio);
return (0);
}
+ PIPE_UNLOCK(mpipe);
return (ENOTTY);
}
@@ -1288,8 +1295,9 @@
#ifdef MAC
int error;
- /* XXXMAC: Pipe should be locked for this check. */
+ PIPE_LOCK(pipe);
error = mac_check_pipe_stat(active_cred, pipe);
+ PIPE_UNLOCK(pipe);
if (error)
return (error);
#endif
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message
More information about the trustedbsd-cvs
mailing list