1 #include "inc.h" 2 3 int 4 check_perm(struct ipc_perm * req, endpoint_t who, int mode) 5 { 6 int req_mode; 7 uid_t uid; 8 gid_t gid; 9 10 uid = getnuid(who); 11 gid = getngid(who); 12 mode &= 0700; 13 14 /* Root is allowed to do anything. */ 15 if (uid == 0) 16 return TRUE; 17 18 if (uid == req->uid || uid == req->cuid) { 19 /* Same user. */ 20 req_mode = req->mode & 0700; 21 } else if (gid == req->gid || gid == req->cgid) { 22 /* Same group. */ 23 req_mode = req->mode & 0070; 24 mode >>= 3; 25 } else { 26 /* Other user and group. */ 27 req_mode = req->mode & 0007; 28 mode >>= 6; 29 } 30 31 return (mode && ((mode & req_mode) == mode)); 32 } 33 34 /* 35 * Copy over an ipc_perm structure to an ipc_perm_sysctl structure. 36 */ 37 void 38 prepare_mib_perm(struct ipc_perm_sysctl * perms, const struct ipc_perm * perm) 39 { 40 41 memset(perms, 0, sizeof(*perms)); 42 perms->_key = perm->_key; 43 perms->uid = perm->uid; 44 perms->gid = perm->gid; 45 perms->cuid = perm->cuid; 46 perms->cgid = perm->cgid; 47 perms->mode = perm->mode; 48 perms->_seq = perm->_seq; 49 } 50