Blame view
kernel/uid16.c
4.96 KB
1da177e4c
|
1 2 3 4 5 6 |
/* * Wrapper functions for 16bit uid back compatibility. All nicely tied * together in the faint hope we can take the out in five years time. */ #include <linux/mm.h> |
1da177e4c
|
7 |
#include <linux/mman.h> |
1da177e4c
|
8 9 10 |
#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/prctl.h> |
c59ede7b7
|
11 |
#include <linux/capability.h> |
1da177e4c
|
12 13 14 15 16 17 |
#include <linux/init.h> #include <linux/highuid.h> #include <linux/security.h> #include <linux/syscalls.h> #include <asm/uaccess.h> |
ca013e945
|
18 |
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c
|
19 |
{ |
2cf096668
|
20 |
return sys_chown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c
|
21 |
} |
ca013e945
|
22 |
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c
|
23 |
{ |
2cf096668
|
24 |
return sys_lchown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c
|
25 |
} |
ca013e945
|
26 |
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) |
1da177e4c
|
27 |
{ |
2cf096668
|
28 |
return sys_fchown(fd, low2highuid(user), low2highgid(group)); |
1da177e4c
|
29 |
} |
a6b42e83f
|
30 |
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) |
1da177e4c
|
31 |
{ |
2cf096668
|
32 |
return sys_setregid(low2highgid(rgid), low2highgid(egid)); |
1da177e4c
|
33 |
} |
a6b42e83f
|
34 |
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) |
1da177e4c
|
35 |
{ |
2cf096668
|
36 |
return sys_setgid(low2highgid(gid)); |
1da177e4c
|
37 |
} |
a6b42e83f
|
38 |
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) |
1da177e4c
|
39 |
{ |
2cf096668
|
40 |
return sys_setreuid(low2highuid(ruid), low2highuid(euid)); |
1da177e4c
|
41 |
} |
a6b42e83f
|
42 |
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) |
1da177e4c
|
43 |
{ |
2cf096668
|
44 |
return sys_setuid(low2highuid(uid)); |
1da177e4c
|
45 |
} |
a6b42e83f
|
46 |
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) |
1da177e4c
|
47 |
{ |
2cf096668
|
48 |
return sys_setresuid(low2highuid(ruid), low2highuid(euid), |
5a7b46b36
|
49 |
low2highuid(suid)); |
1da177e4c
|
50 |
} |
a29c33f4e
|
51 |
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp) |
1da177e4c
|
52 |
{ |
86a264abe
|
53 |
const struct cred *cred = current_cred(); |
1da177e4c
|
54 |
int retval; |
a29c33f4e
|
55 |
old_uid_t ruid, euid, suid; |
1da177e4c
|
56 |
|
a29c33f4e
|
57 58 59 60 61 62 63 |
ruid = high2lowuid(from_kuid_munged(cred->user_ns, cred->uid)); euid = high2lowuid(from_kuid_munged(cred->user_ns, cred->euid)); suid = high2lowuid(from_kuid_munged(cred->user_ns, cred->suid)); if (!(retval = put_user(ruid, ruidp)) && !(retval = put_user(euid, euidp))) retval = put_user(suid, suidp); |
1da177e4c
|
64 65 66 |
return retval; } |
a6b42e83f
|
67 |
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) |
1da177e4c
|
68 |
{ |
2cf096668
|
69 |
return sys_setresgid(low2highgid(rgid), low2highgid(egid), |
5a7b46b36
|
70 |
low2highgid(sgid)); |
1da177e4c
|
71 |
} |
a6b42e83f
|
72 |
|
a29c33f4e
|
73 |
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp) |
1da177e4c
|
74 |
{ |
86a264abe
|
75 |
const struct cred *cred = current_cred(); |
1da177e4c
|
76 |
int retval; |
a29c33f4e
|
77 78 79 80 81 |
old_gid_t rgid, egid, sgid; rgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->gid)); egid = high2lowgid(from_kgid_munged(cred->user_ns, cred->egid)); sgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->sgid)); |
1da177e4c
|
82 |
|
a29c33f4e
|
83 84 85 |
if (!(retval = put_user(rgid, rgidp)) && !(retval = put_user(egid, egidp))) retval = put_user(sgid, sgidp); |
1da177e4c
|
86 87 88 |
return retval; } |
a6b42e83f
|
89 |
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) |
1da177e4c
|
90 |
{ |
2cf096668
|
91 |
return sys_setfsuid(low2highuid(uid)); |
1da177e4c
|
92 |
} |
a6b42e83f
|
93 |
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) |
1da177e4c
|
94 |
{ |
2cf096668
|
95 |
return sys_setfsgid(low2highgid(gid)); |
1da177e4c
|
96 97 98 99 100 |
} static int groups16_to_user(old_gid_t __user *grouplist, struct group_info *group_info) { |
ae2975bc3
|
101 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c
|
102 103 |
int i; old_gid_t group; |
ae2975bc3
|
104 |
kgid_t kgid; |
1da177e4c
|
105 106 |
for (i = 0; i < group_info->ngroups; i++) { |
ae2975bc3
|
107 108 |
kgid = GROUP_AT(group_info, i); group = high2lowgid(from_kgid_munged(user_ns, kgid)); |
1da177e4c
|
109 110 111 112 113 114 115 116 117 118 |
if (put_user(group, grouplist+i)) return -EFAULT; } return 0; } static int groups16_from_user(struct group_info *group_info, old_gid_t __user *grouplist) { |
ae2975bc3
|
119 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c
|
120 121 |
int i; old_gid_t group; |
ae2975bc3
|
122 |
kgid_t kgid; |
1da177e4c
|
123 124 125 126 |
for (i = 0; i < group_info->ngroups; i++) { if (get_user(group, grouplist+i)) return -EFAULT; |
ae2975bc3
|
127 128 129 130 131 132 |
kgid = make_kgid(user_ns, low2highgid(group)); if (!gid_valid(kgid)) return -EINVAL; GROUP_AT(group_info, i) = kgid; |
1da177e4c
|
133 134 135 136 |
} return 0; } |
003d7ab47
|
137 |
SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c
|
138 |
{ |
86a264abe
|
139 140 |
const struct cred *cred = current_cred(); int i; |
1da177e4c
|
141 142 143 |
if (gidsetsize < 0) return -EINVAL; |
86a264abe
|
144 |
i = cred->group_info->ngroups; |
1da177e4c
|
145 146 147 148 149 |
if (gidsetsize) { if (i > gidsetsize) { i = -EINVAL; goto out; } |
86a264abe
|
150 |
if (groups16_to_user(grouplist, cred->group_info)) { |
1da177e4c
|
151 152 153 154 155 |
i = -EFAULT; goto out; } } out: |
1da177e4c
|
156 157 |
return i; } |
003d7ab47
|
158 |
SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c
|
159 160 161 |
{ struct group_info *group_info; int retval; |
7ff4d90b4
|
162 |
if (!may_setgroups()) |
1da177e4c
|
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
return -EPERM; if ((unsigned)gidsetsize > NGROUPS_MAX) return -EINVAL; group_info = groups_alloc(gidsetsize); if (!group_info) return -ENOMEM; retval = groups16_from_user(group_info, grouplist); if (retval) { put_group_info(group_info); return retval; } retval = set_current_groups(group_info); put_group_info(group_info); return retval; } |
003d7ab47
|
181 |
SYSCALL_DEFINE0(getuid16) |
1da177e4c
|
182 |
{ |
a29c33f4e
|
183 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_uid())); |
1da177e4c
|
184 |
} |
003d7ab47
|
185 |
SYSCALL_DEFINE0(geteuid16) |
1da177e4c
|
186 |
{ |
a29c33f4e
|
187 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_euid())); |
1da177e4c
|
188 |
} |
003d7ab47
|
189 |
SYSCALL_DEFINE0(getgid16) |
1da177e4c
|
190 |
{ |
a29c33f4e
|
191 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_gid())); |
1da177e4c
|
192 |
} |
003d7ab47
|
193 |
SYSCALL_DEFINE0(getegid16) |
1da177e4c
|
194 |
{ |
a29c33f4e
|
195 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_egid())); |
1da177e4c
|
196 |
} |