Blame view
kernel/uid16.c
5.08 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 |
/* * 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 Linux-2.6.12-rc2 |
8 |
#include <linux/mman.h> |
1da177e4c Linux-2.6.12-rc2 |
9 10 11 |
#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/prctl.h> |
c59ede7b7 [PATCH] move capa... |
12 |
#include <linux/capability.h> |
1da177e4c Linux-2.6.12-rc2 |
13 14 15 |
#include <linux/init.h> #include <linux/highuid.h> #include <linux/security.h> |
5b825c3af sched/headers: Pr... |
16 |
#include <linux/cred.h> |
1da177e4c Linux-2.6.12-rc2 |
17 |
#include <linux/syscalls.h> |
7c0f6ba68 Replace <asm/uacc... |
18 |
#include <linux/uaccess.h> |
1da177e4c Linux-2.6.12-rc2 |
19 |
|
e530dca58 kernel: provide k... |
20 |
#include "uid16.h" |
ca013e945 [CVE-2009-0029] S... |
21 |
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
22 |
{ |
55731b3cd fs: add do_fchown... |
23 |
return ksys_chown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
24 |
} |
ca013e945 [CVE-2009-0029] S... |
25 |
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
26 |
{ |
55731b3cd fs: add do_fchown... |
27 |
return ksys_lchown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
28 |
} |
ca013e945 [CVE-2009-0029] S... |
29 |
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
30 |
{ |
55731b3cd fs: add do_fchown... |
31 |
return ksys_fchown(fd, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
32 |
} |
a6b42e83f [CVE-2009-0029] S... |
33 |
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) |
1da177e4c Linux-2.6.12-rc2 |
34 |
{ |
e530dca58 kernel: provide k... |
35 |
return __sys_setregid(low2highgid(rgid), low2highgid(egid)); |
1da177e4c Linux-2.6.12-rc2 |
36 |
} |
a6b42e83f [CVE-2009-0029] S... |
37 |
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
38 |
{ |
e530dca58 kernel: provide k... |
39 |
return __sys_setgid(low2highgid(gid)); |
1da177e4c Linux-2.6.12-rc2 |
40 |
} |
a6b42e83f [CVE-2009-0029] S... |
41 |
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) |
1da177e4c Linux-2.6.12-rc2 |
42 |
{ |
e530dca58 kernel: provide k... |
43 |
return __sys_setreuid(low2highuid(ruid), low2highuid(euid)); |
1da177e4c Linux-2.6.12-rc2 |
44 |
} |
a6b42e83f [CVE-2009-0029] S... |
45 |
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
46 |
{ |
e530dca58 kernel: provide k... |
47 |
return __sys_setuid(low2highuid(uid)); |
1da177e4c Linux-2.6.12-rc2 |
48 |
} |
a6b42e83f [CVE-2009-0029] S... |
49 |
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) |
1da177e4c Linux-2.6.12-rc2 |
50 |
{ |
e530dca58 kernel: provide k... |
51 |
return __sys_setresuid(low2highuid(ruid), low2highuid(euid), |
5a7b46b36 [PATCH] Add more ... |
52 |
low2highuid(suid)); |
1da177e4c Linux-2.6.12-rc2 |
53 |
} |
a29c33f4e userns: Convert s... |
54 |
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp) |
1da177e4c Linux-2.6.12-rc2 |
55 |
{ |
86a264abe CRED: Wrap curren... |
56 |
const struct cred *cred = current_cred(); |
1da177e4c Linux-2.6.12-rc2 |
57 |
int retval; |
a29c33f4e userns: Convert s... |
58 |
old_uid_t ruid, euid, suid; |
1da177e4c Linux-2.6.12-rc2 |
59 |
|
a29c33f4e userns: Convert s... |
60 61 62 63 64 65 66 |
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 Linux-2.6.12-rc2 |
67 68 69 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
70 |
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) |
1da177e4c Linux-2.6.12-rc2 |
71 |
{ |
e530dca58 kernel: provide k... |
72 |
return __sys_setresgid(low2highgid(rgid), low2highgid(egid), |
5a7b46b36 [PATCH] Add more ... |
73 |
low2highgid(sgid)); |
1da177e4c Linux-2.6.12-rc2 |
74 |
} |
a29c33f4e userns: Convert s... |
75 |
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp) |
1da177e4c Linux-2.6.12-rc2 |
76 |
{ |
86a264abe CRED: Wrap curren... |
77 |
const struct cred *cred = current_cred(); |
1da177e4c Linux-2.6.12-rc2 |
78 |
int retval; |
a29c33f4e userns: Convert s... |
79 80 81 82 83 |
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 Linux-2.6.12-rc2 |
84 |
|
a29c33f4e userns: Convert s... |
85 86 87 |
if (!(retval = put_user(rgid, rgidp)) && !(retval = put_user(egid, egidp))) retval = put_user(sgid, sgidp); |
1da177e4c Linux-2.6.12-rc2 |
88 89 90 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
91 |
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
92 |
{ |
e530dca58 kernel: provide k... |
93 |
return __sys_setfsuid(low2highuid(uid)); |
1da177e4c Linux-2.6.12-rc2 |
94 |
} |
a6b42e83f [CVE-2009-0029] S... |
95 |
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
96 |
{ |
e530dca58 kernel: provide k... |
97 |
return __sys_setfsgid(low2highgid(gid)); |
1da177e4c Linux-2.6.12-rc2 |
98 99 100 101 102 |
} static int groups16_to_user(old_gid_t __user *grouplist, struct group_info *group_info) { |
ae2975bc3 userns: Convert g... |
103 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c Linux-2.6.12-rc2 |
104 105 |
int i; old_gid_t group; |
ae2975bc3 userns: Convert g... |
106 |
kgid_t kgid; |
1da177e4c Linux-2.6.12-rc2 |
107 108 |
for (i = 0; i < group_info->ngroups; i++) { |
81243eacf cred: simpler, 1D... |
109 |
kgid = group_info->gid[i]; |
ae2975bc3 userns: Convert g... |
110 |
group = high2lowgid(from_kgid_munged(user_ns, kgid)); |
1da177e4c Linux-2.6.12-rc2 |
111 112 113 114 115 116 117 118 119 120 |
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 userns: Convert g... |
121 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c Linux-2.6.12-rc2 |
122 123 |
int i; old_gid_t group; |
ae2975bc3 userns: Convert g... |
124 |
kgid_t kgid; |
1da177e4c Linux-2.6.12-rc2 |
125 126 127 128 |
for (i = 0; i < group_info->ngroups; i++) { if (get_user(group, grouplist+i)) return -EFAULT; |
ae2975bc3 userns: Convert g... |
129 130 131 132 |
kgid = make_kgid(user_ns, low2highgid(group)); if (!gid_valid(kgid)) return -EINVAL; |
81243eacf cred: simpler, 1D... |
133 |
group_info->gid[i] = kgid; |
1da177e4c Linux-2.6.12-rc2 |
134 135 136 137 |
} return 0; } |
003d7ab47 [CVE-2009-0029] S... |
138 |
SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
139 |
{ |
86a264abe CRED: Wrap curren... |
140 141 |
const struct cred *cred = current_cred(); int i; |
1da177e4c Linux-2.6.12-rc2 |
142 143 144 |
if (gidsetsize < 0) return -EINVAL; |
86a264abe CRED: Wrap curren... |
145 |
i = cred->group_info->ngroups; |
1da177e4c Linux-2.6.12-rc2 |
146 147 148 149 150 |
if (gidsetsize) { if (i > gidsetsize) { i = -EINVAL; goto out; } |
86a264abe CRED: Wrap curren... |
151 |
if (groups16_to_user(grouplist, cred->group_info)) { |
1da177e4c Linux-2.6.12-rc2 |
152 153 154 155 156 |
i = -EFAULT; goto out; } } out: |
1da177e4c Linux-2.6.12-rc2 |
157 158 |
return i; } |
003d7ab47 [CVE-2009-0029] S... |
159 |
SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
160 161 162 |
{ struct group_info *group_info; int retval; |
7ff4d90b4 groups: Consolida... |
163 |
if (!may_setgroups()) |
1da177e4c Linux-2.6.12-rc2 |
164 165 166 167 168 169 170 171 172 173 174 175 |
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; } |
bdcf0a423 kernel: make grou... |
176 |
groups_sort(group_info); |
1da177e4c Linux-2.6.12-rc2 |
177 178 179 180 181 |
retval = set_current_groups(group_info); put_group_info(group_info); return retval; } |
003d7ab47 [CVE-2009-0029] S... |
182 |
SYSCALL_DEFINE0(getuid16) |
1da177e4c Linux-2.6.12-rc2 |
183 |
{ |
a29c33f4e userns: Convert s... |
184 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_uid())); |
1da177e4c Linux-2.6.12-rc2 |
185 |
} |
003d7ab47 [CVE-2009-0029] S... |
186 |
SYSCALL_DEFINE0(geteuid16) |
1da177e4c Linux-2.6.12-rc2 |
187 |
{ |
a29c33f4e userns: Convert s... |
188 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_euid())); |
1da177e4c Linux-2.6.12-rc2 |
189 |
} |
003d7ab47 [CVE-2009-0029] S... |
190 |
SYSCALL_DEFINE0(getgid16) |
1da177e4c Linux-2.6.12-rc2 |
191 |
{ |
a29c33f4e userns: Convert s... |
192 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_gid())); |
1da177e4c Linux-2.6.12-rc2 |
193 |
} |
003d7ab47 [CVE-2009-0029] S... |
194 |
SYSCALL_DEFINE0(getegid16) |
1da177e4c Linux-2.6.12-rc2 |
195 |
{ |
a29c33f4e userns: Convert s... |
196 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_egid())); |
1da177e4c Linux-2.6.12-rc2 |
197 |
} |