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