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