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