summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2011-04-06 16:59:54 +0000
committertrasz <trasz@FreeBSD.org>2011-04-06 16:59:54 +0000
commitd6f4192036c8ed6ef963cdb7793404025756ab06 (patch)
tree1bb412523ffd3b85f320c30f0d19d8cd22bd8c98
parent440cd5face8a8098f95d7e1a290efcde8e22adcd (diff)
downloadFreeBSD-src-d6f4192036c8ed6ef963cdb7793404025756ab06.zip
FreeBSD-src-d6f4192036c8ed6ef963cdb7793404025756ab06.tar.gz
Add ucred pointer to the SysV-related memory structures. This is required
for racct. Note that after this commit, ipcs(1) needs to be rebuilt. Otherwise, it will fail with "ipcs: sysctlbyname: kern.ipc.msqids: Cannot allocate memory". Sponsored by: The FreeBSD Foundation Reviewed by: kib (earlier version)
-rw-r--r--sys/kern/sysv_msg.c5
-rw-r--r--sys/kern/sysv_sem.c4
-rw-r--r--sys/kern/sysv_shm.c4
-rw-r--r--sys/sys/msg.h1
-rw-r--r--sys/sys/sem.h1
-rw-r--r--sys/sys/shm.h1
6 files changed, 16 insertions, 0 deletions
diff --git a/sys/kern/sysv_msg.c b/sys/kern/sysv_msg.c
index ace2eab..3e67bd0 100644
--- a/sys/kern/sysv_msg.c
+++ b/sys/kern/sysv_msg.c
@@ -466,6 +466,9 @@ kern_msgctl(td, msqid, cmd, msqbuf)
}
#endif
+ crfree(msqkptr->cred);
+ msqkptr->cred = NULL;
+
/* Free the message headers */
msghdr = msqkptr->u.msg_first;
while (msghdr != NULL) {
@@ -620,6 +623,8 @@ msgget(td, uap)
msqkptr->u.msg_perm.cgid = cred->cr_gid;
msqkptr->u.msg_perm.gid = cred->cr_gid;
msqkptr->u.msg_perm.mode = (msgflg & 0777);
+ crhold(cred);
+ msqkptr->cred = cred;
/* Make sure that the returned msqid is unique */
msqkptr->u.msg_perm.seq = (msqkptr->u.msg_perm.seq + 1) & 0x7fff;
msqkptr->u.msg_first = NULL;
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index d51fbee..04284cc 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -656,6 +656,8 @@ kern_semctl(struct thread *td, int semid, int semnum, int cmd,
semakptr->u.sem_perm.cuid = cred->cr_uid;
semakptr->u.sem_perm.uid = cred->cr_uid;
semakptr->u.sem_perm.mode = 0;
+ crfree(semakptr->cred);
+ semakptr->cred = NULL;
SEMUNDO_LOCK();
semundo_clear(semidx, -1);
SEMUNDO_UNLOCK();
@@ -937,6 +939,8 @@ semget(struct thread *td, struct semget_args *uap)
sema[semid].u.sem_perm.cgid = cred->cr_gid;
sema[semid].u.sem_perm.gid = cred->cr_gid;
sema[semid].u.sem_perm.mode = (semflg & 0777) | SEM_ALLOC;
+ crhold(cred);
+ sema[semid].cred = cred;
sema[semid].u.sem_perm.seq =
(sema[semid].u.sem_perm.seq + 1) & 0x7fff;
sema[semid].u.sem_nsems = nsems;
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 5ea9e5d..645184c 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -246,6 +246,8 @@ shm_deallocate_segment(shmseg)
#ifdef MAC
mac_sysvshm_cleanup(shmseg);
#endif
+ crfree(shmseg->cred);
+ shmseg->cred = NULL;
}
static int
@@ -694,6 +696,8 @@ shmget_allocate_segment(td, uap, mode)
shmseg->u.shm_perm.cgid = shmseg->u.shm_perm.gid = cred->cr_gid;
shmseg->u.shm_perm.mode = (shmseg->u.shm_perm.mode & SHMSEG_WANTED) |
(mode & ACCESSPERMS) | SHMSEG_ALLOCATED;
+ crhold(cred);
+ shmseg->cred = cred;
shmseg->u.shm_segsz = uap->size;
shmseg->u.shm_cpid = td->td_proc->p_pid;
shmseg->u.shm_lpid = shmseg->u.shm_nattch = 0;
diff --git a/sys/sys/msg.h b/sys/sys/msg.h
index e4edd09..f4193c8 100644
--- a/sys/sys/msg.h
+++ b/sys/sys/msg.h
@@ -160,6 +160,7 @@ struct msqid_kernel {
* Kernel-private components of the message queue.
*/
struct label *label; /* MAC label */
+ struct ucred *cred; /* creator's credentials */
};
#else /* !_KERNEL */
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
index 458ffb9..cce28f0 100644
--- a/sys/sys/sem.h
+++ b/sys/sys/sem.h
@@ -126,6 +126,7 @@ extern struct seminfo seminfo;
struct semid_kernel {
struct semid_ds u;
struct label *label; /* MAC framework label */
+ struct ucred *cred; /* creator's credentials */
};
/* internal "mode" bits */
diff --git a/sys/sys/shm.h b/sys/sys/shm.h
index 7fe3dae..799bbf5 100644
--- a/sys/sys/shm.h
+++ b/sys/sys/shm.h
@@ -124,6 +124,7 @@ struct shmid_kernel {
struct shmid_ds u;
vm_object_t object;
struct label *label; /* MAC label */
+ struct ucred *cred; /* creator's credendials */
};
extern struct shminfo shminfo;
OpenPOWER on IntegriCloud