42#include "opt_sysvipc.h"
90ipcperm(
struct thread *td,
struct ipc_perm *perm,
int acc_mode)
92 struct ucred *cred = td->td_ucred;
93 int error, obj_mode, dac_granted, priv_granted;
96 if (cred->cr_uid == perm->cuid || cred->cr_uid == perm->uid) {
97 obj_mode = perm->mode;
101 obj_mode = perm->mode;
104 obj_mode = perm->mode;
114 if (obj_mode & IPC_M)
115 dac_granted |= IPC_M;
117 if (obj_mode & IPC_R)
118 dac_granted |= IPC_R;
119 if (obj_mode & IPC_W)
120 dac_granted |= IPC_W;
125 if ((dac_granted & acc_mode) == acc_mode)
132 if ((acc_mode & IPC_M) && !(dac_granted & IPC_M)) {
135 priv_granted |= IPC_M;
138 if ((acc_mode & IPC_R) && !(dac_granted & IPC_R)) {
141 priv_granted |= IPC_R;
144 if ((acc_mode & IPC_W) && !(dac_granted & IPC_W)) {
147 priv_granted |= IPC_W;
150 if (((dac_granted | priv_granted) & acc_mode) == acc_mode)
156#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
157 defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
159ipcperm_old2new(
struct ipc_perm_old *old,
struct ipc_perm *
new)
162 new->cuid = old->cuid;
163 new->cgid = old->cgid;
166 new->mode = old->mode;
172ipcperm_new2old(
struct ipc_perm *
new,
struct ipc_perm_old *old)
176 old->cuid =
new->cuid;
177 old->cgid =
new->cgid;
180 old->mode =
new->mode;
186#ifdef COMPAT_FREEBSD32
187#include <sys/mount.h>
188#include <sys/socket.h>
189#include <compat/freebsd32/freebsd32.h>
190#include <compat/freebsd32/freebsd32_ipc.h>
191#include <compat/freebsd32/freebsd32_proto.h>
192#include <compat/freebsd32/freebsd32_signal.h>
193#include <compat/freebsd32/freebsd32_syscall.h>
194#include <compat/freebsd32/freebsd32_util.h>
196#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
197 defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
199freebsd32_ipcperm_old_in(
struct ipc_perm_old32 *ip32,
struct ipc_perm *ip)
202 CP(*ip32, *ip, cuid);
203 CP(*ip32, *ip, cgid);
206 CP(*ip32, *ip,
mode);
212freebsd32_ipcperm_old_out(
struct ipc_perm *ip,
struct ipc_perm_old32 *ip32)
215 CP(*ip, *ip32, cuid);
216 CP(*ip, *ip32, cgid);
219 CP(*ip, *ip32,
mode);
226freebsd32_ipcperm_in(
struct ipc_perm32 *ip32,
struct ipc_perm *ip)
229 CP(*ip32, *ip, cuid);
230 CP(*ip32, *ip, cgid);
233 CP(*ip32, *ip,
mode);
239freebsd32_ipcperm_out(
struct ipc_perm *ip,
struct ipc_perm32 *ip32)
242 CP(*ip, *ip32, cuid);
243 CP(*ip, *ip32, cgid);
246 CP(*ip, *ip32,
mode);
int priv_check(struct thread *td, int priv)
int groupmember(gid_t gid, struct ucred *cred)
int ipcperm(struct thread *td, struct ipc_perm *perm, int acc_mode)
void shmexit(struct vmspace *vm)
void shmfork(struct proc *p1, struct proc *p2)
void(* shmexit_hook)(struct vmspace *)
void(* shmfork_hook)(struct proc *, struct proc *)