Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150464803
D45175.id138617.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D45175.id138617.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D45175: SysV IPC: provide in-kernel helpers to obtain ipcs(8)-like information
Attached
Detach File
Event Timeline
Log In to Comment