Page MenuHomeFreeBSD

D45175.id138617.diff
No OneTemporary

D45175.id138617.diff

diff --git a/sys/kern/sysv_msg.c b/sys/kern/sysv_msg.c
--- a/sys/kern/sysv_msg.c
+++ b/sys/kern/sysv_msg.c
@@ -1477,6 +1477,40 @@
return (error);
}
+int
+kern_get_msqids(struct thread *td, struct msqid_kernel **res, size_t *sz)
+{
+ struct msqid_kernel *pmsqk;
+ struct prison *pr, *rpr;
+ int i, mi;
+
+ *sz = mi = msginfo.msgmni;
+ if (res == NULL)
+ return (0);
+
+ pr = td->td_ucred->cr_prison;
+ rpr = msg_find_prison(td->td_ucred);
+ *res = malloc(sizeof(struct msqid_kernel) * mi, M_TEMP, M_WAITOK);
+ for (i = 0; i < mi; i++) {
+ pmsqk = &(*res)[i];
+ mtx_lock(&msq_mtx);
+ if (msqids[i].u.msg_qbytes == 0 || rpr == NULL ||
+ msq_prison_cansee(rpr, &msqids[i]) != 0)
+ bzero(pmsqk, sizeof(*pmsqk));
+ else {
+ *pmsqk = msqids[i];
+ if (pmsqk->cred->cr_prison != pr)
+ pmsqk->u.msg_perm.key = IPC_PRIVATE;
+ }
+ mtx_unlock(&msq_mtx);
+ pmsqk->u.__msg_first = NULL;
+ pmsqk->u.__msg_last = NULL;
+ pmsqk->label = NULL;
+ pmsqk->cred = NULL;
+ }
+ return (0);
+}
+
SYSCTL_INT(_kern_ipc, OID_AUTO, msgmax, CTLFLAG_RD, &msginfo.msgmax, 0,
"Maximum message size");
SYSCTL_INT(_kern_ipc, OID_AUTO, msgmni, CTLFLAG_RDTUN, &msginfo.msgmni, 0,
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1574,6 +1574,39 @@
return (error);
}
+int
+kern_get_sema(struct thread *td, struct semid_kernel **res, size_t *sz)
+{
+ struct prison *pr, *rpr;
+ struct semid_kernel *psemak;
+ int i, mi;
+
+ *sz = mi = seminfo.semmni;
+ if (res == NULL)
+ return (0);
+
+ pr = td->td_ucred->cr_prison;
+ rpr = sem_find_prison(td->td_ucred);
+ *res = malloc(sizeof(struct semid_kernel) * mi, M_TEMP, M_WAITOK);
+ for (i = 0; i < mi; i++) {
+ psemak = &(*res)[i];
+ mtx_lock(&sema_mtx[i]);
+ if ((sema[i].u.sem_perm.mode & SEM_ALLOC) == 0 ||
+ rpr == NULL || sem_prison_cansee(rpr, &sema[i]) != 0)
+ bzero(psemak, sizeof(*psemak));
+ else {
+ *psemak = sema[i];
+ if (psemak->cred->cr_prison != pr)
+ psemak->u.sem_perm.key = IPC_PRIVATE;
+ }
+ mtx_unlock(&sema_mtx[i]);
+ psemak->u.__sem_base = NULL;
+ psemak->label = NULL;
+ psemak->cred = NULL;
+ }
+ return (0);
+}
+
static int
sem_prison_check(void *obj, void *data)
{
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -109,10 +109,6 @@
static MALLOC_DEFINE(M_SHM, "shm", "SVID compatible shared memory segments");
-#define SHMSEG_FREE 0x0200
-#define SHMSEG_REMOVED 0x0400
-#define SHMSEG_ALLOCATED 0x0800
-
static int shm_last_free, shm_nused, shmalloced;
vm_size_t shm_committed;
static struct shmid_kernel *shmsegs;
@@ -1093,6 +1089,42 @@
return (error);
}
+int
+kern_get_shmsegs(struct thread *td, struct shmid_kernel **res, size_t *sz)
+{
+ struct shmid_kernel *pshmseg;
+ struct prison *pr, *rpr;
+ int i;
+
+ SYSVSHM_LOCK();
+ *sz = shmalloced;
+ if (res == NULL)
+ goto out;
+
+ pr = td->td_ucred->cr_prison;
+ rpr = shm_find_prison(td->td_ucred);
+ *res = malloc(sizeof(struct shmid_kernel) * shmalloced, M_TEMP,
+ M_WAITOK);
+ for (i = 0; i < shmalloced; i++) {
+ pshmseg = &(*res)[i];
+ if ((shmsegs[i].u.shm_perm.mode & SHMSEG_ALLOCATED) == 0 ||
+ rpr == NULL || shm_prison_cansee(rpr, &shmsegs[i]) != 0) {
+ bzero(pshmseg, sizeof(*pshmseg));
+ pshmseg->u.shm_perm.mode = SHMSEG_FREE;
+ } else {
+ *pshmseg = shmsegs[i];
+ if (pshmseg->cred->cr_prison != pr)
+ pshmseg->u.shm_perm.key = IPC_PRIVATE;
+ }
+ pshmseg->object = NULL;
+ pshmseg->label = NULL;
+ pshmseg->cred = NULL;
+ }
+out:
+ SYSVSHM_UNLOCK();
+ return (0);
+}
+
static int
shm_prison_check(void *obj, void *data)
{
diff --git a/sys/sys/msg.h b/sys/sys/msg.h
--- a/sys/sys/msg.h
+++ b/sys/sys/msg.h
@@ -152,6 +152,9 @@
#ifdef _KERNEL
extern struct msginfo msginfo;
+int kern_get_msqids(struct thread *td, struct msqid_kernel **res,
+ size_t *sz);
+
#else /* _KERNEL */
__BEGIN_DECLS
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
--- a/sys/sys/sem.h
+++ b/sys/sys/sem.h
@@ -142,6 +142,9 @@
*/
void semexit(struct proc *p);
+int kern_get_sema(struct thread *td, struct semid_kernel **res,
+ size_t *sz);
+
#else /* !_KERNEL */
__BEGIN_DECLS
diff --git a/sys/sys/shm.h b/sys/sys/shm.h
--- a/sys/sys/shm.h
+++ b/sys/sys/shm.h
@@ -152,8 +152,14 @@
extern struct shminfo shminfo;
+#define SHMSEG_FREE 0x0200
+#define SHMSEG_REMOVED 0x0400
+#define SHMSEG_ALLOCATED 0x0800
+
void shmexit(struct vmspace *);
void shmfork(struct proc *, struct proc *);
+int kern_get_shmsegs(struct thread *td, struct shmid_kernel **res,
+ size_t *sz);
#else /* !_KERNEL */

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 2, 10:58 AM (15 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30719715
Default Alt Text
D45175.id138617.diff (4 KB)

Event Timeline