summaryrefslogtreecommitdiffstats
path: root/sys/security/mac_mls/mac_mls.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-08-21 17:45:00 +0000
committerkib <kib@FreeBSD.org>2013-08-21 17:45:00 +0000
commitd11c4f9c32bf7f78b6ca5f9fc02e869111dbe680 (patch)
treed04455df948dc71b9ece838e75596e329c610c9d /sys/security/mac_mls/mac_mls.c
parent6a459eb27c6a215b645e8673b5275f94003510a4 (diff)
downloadFreeBSD-src-d11c4f9c32bf7f78b6ca5f9fc02e869111dbe680.zip
FreeBSD-src-d11c4f9c32bf7f78b6ca5f9fc02e869111dbe680.tar.gz
Implement read(2)/write(2) and neccessary lseek(2) for posix shmfd.
Add MAC framework entries for posix shm read and write. Do not allow implicit extension of the underlying memory segment past the limit set by ftruncate(2) by either of the syscalls. Read and write returns short i/o, lseek(2) fails with EINVAL when resulting offset does not fit into the limit. Discussed with: alc Tested by: pho Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys/security/mac_mls/mac_mls.c')
-rw-r--r--sys/security/mac_mls/mac_mls.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c
index ff9084e..8980f50 100644
--- a/sys/security/mac_mls/mac_mls.c
+++ b/sys/security/mac_mls/mac_mls.c
@@ -1651,6 +1651,24 @@ mls_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd,
}
static int
+mls_posixshm_check_read(struct ucred *active_cred, struct ucred *file_cred,
+ struct shmfd *shm, struct label *shmlabel)
+{
+ struct mac_mls *subj, *obj;
+
+ if (!mls_enabled || !revocation_enabled)
+ return (0);
+
+ subj = SLOT(active_cred->cr_label);
+ obj = SLOT(shmlabel);
+
+ if (!mls_dominate_effective(subj, obj))
+ return (EACCES);
+
+ return (0);
+}
+
+static int
mls_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd,
struct label *shmlabel, mode_t mode)
{
@@ -1740,6 +1758,24 @@ mls_posixshm_check_unlink(struct ucred *cred, struct shmfd *shmfd,
return (0);
}
+static int
+mls_posixshm_check_write(struct ucred *active_cred, struct ucred *file_cred,
+ struct shmfd *shm, struct label *shmlabel)
+{
+ struct mac_mls *subj, *obj;
+
+ if (!mls_enabled || !revocation_enabled)
+ return (0);
+
+ subj = SLOT(active_cred->cr_label);
+ obj = SLOT(shmlabel);
+
+ if (!mls_dominate_effective(subj, obj))
+ return (EACCES);
+
+ return (0);
+}
+
static void
mls_posixshm_create(struct ucred *cred, struct shmfd *shmfd,
struct label *shmlabel)
@@ -3280,11 +3316,13 @@ static struct mac_policy_ops mls_ops =
.mpo_posixshm_check_mmap = mls_posixshm_check_mmap,
.mpo_posixshm_check_open = mls_posixshm_check_open,
+ .mpo_posixshm_check_read = mls_posixshm_check_read,
.mpo_posixshm_check_setmode = mls_posixshm_check_setmode,
.mpo_posixshm_check_setowner = mls_posixshm_check_setowner,
.mpo_posixshm_check_stat = mls_posixshm_check_stat,
.mpo_posixshm_check_truncate = mls_posixshm_check_truncate,
.mpo_posixshm_check_unlink = mls_posixshm_check_unlink,
+ .mpo_posixshm_check_write = mls_posixshm_check_write,
.mpo_posixshm_create = mls_posixshm_create,
.mpo_posixshm_destroy_label = mls_destroy_label,
.mpo_posixshm_init_label = mls_init_label,
OpenPOWER on IntegriCloud