Blame view
kernel/uid16.c
4.99 KB
1da177e4c Linux-2.6.12-rc2 |
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 Linux-2.6.12-rc2 |
7 |
#include <linux/mman.h> |
1da177e4c Linux-2.6.12-rc2 |
8 9 10 |
#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/prctl.h> |
c59ede7b7 [PATCH] move capa... |
11 |
#include <linux/capability.h> |
1da177e4c Linux-2.6.12-rc2 |
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 [CVE-2009-0029] S... |
18 |
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
19 |
{ |
2cf096668 make SYSCALL_DEFI... |
20 |
return sys_chown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
21 |
} |
ca013e945 [CVE-2009-0029] S... |
22 |
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
23 |
{ |
2cf096668 make SYSCALL_DEFI... |
24 |
return sys_lchown(filename, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
25 |
} |
ca013e945 [CVE-2009-0029] S... |
26 |
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
27 |
{ |
2cf096668 make SYSCALL_DEFI... |
28 |
return sys_fchown(fd, low2highuid(user), low2highgid(group)); |
1da177e4c Linux-2.6.12-rc2 |
29 |
} |
a6b42e83f [CVE-2009-0029] S... |
30 |
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) |
1da177e4c Linux-2.6.12-rc2 |
31 |
{ |
2cf096668 make SYSCALL_DEFI... |
32 |
return sys_setregid(low2highgid(rgid), low2highgid(egid)); |
1da177e4c Linux-2.6.12-rc2 |
33 |
} |
a6b42e83f [CVE-2009-0029] S... |
34 |
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
35 |
{ |
2cf096668 make SYSCALL_DEFI... |
36 |
return sys_setgid(low2highgid(gid)); |
1da177e4c Linux-2.6.12-rc2 |
37 |
} |
a6b42e83f [CVE-2009-0029] S... |
38 |
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) |
1da177e4c Linux-2.6.12-rc2 |
39 |
{ |
2cf096668 make SYSCALL_DEFI... |
40 |
return sys_setreuid(low2highuid(ruid), low2highuid(euid)); |
1da177e4c Linux-2.6.12-rc2 |
41 |
} |
a6b42e83f [CVE-2009-0029] S... |
42 |
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
43 |
{ |
2cf096668 make SYSCALL_DEFI... |
44 |
return sys_setuid(low2highuid(uid)); |
1da177e4c Linux-2.6.12-rc2 |
45 |
} |
a6b42e83f [CVE-2009-0029] S... |
46 |
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) |
1da177e4c Linux-2.6.12-rc2 |
47 |
{ |
2cf096668 make SYSCALL_DEFI... |
48 |
return sys_setresuid(low2highuid(ruid), low2highuid(euid), |
5a7b46b36 [PATCH] Add more ... |
49 |
low2highuid(suid)); |
1da177e4c Linux-2.6.12-rc2 |
50 |
} |
a29c33f4e userns: Convert s... |
51 |
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp) |
1da177e4c Linux-2.6.12-rc2 |
52 |
{ |
86a264abe CRED: Wrap curren... |
53 |
const struct cred *cred = current_cred(); |
1da177e4c Linux-2.6.12-rc2 |
54 |
int retval; |
a29c33f4e userns: Convert s... |
55 |
old_uid_t ruid, euid, suid; |
1da177e4c Linux-2.6.12-rc2 |
56 |
|
a29c33f4e userns: Convert s... |
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 Linux-2.6.12-rc2 |
64 65 66 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
67 |
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) |
1da177e4c Linux-2.6.12-rc2 |
68 |
{ |
2cf096668 make SYSCALL_DEFI... |
69 |
return sys_setresgid(low2highgid(rgid), low2highgid(egid), |
5a7b46b36 [PATCH] Add more ... |
70 |
low2highgid(sgid)); |
1da177e4c Linux-2.6.12-rc2 |
71 |
} |
a6b42e83f [CVE-2009-0029] S... |
72 |
|
a29c33f4e userns: Convert s... |
73 |
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp) |
1da177e4c Linux-2.6.12-rc2 |
74 |
{ |
86a264abe CRED: Wrap curren... |
75 |
const struct cred *cred = current_cred(); |
1da177e4c Linux-2.6.12-rc2 |
76 |
int retval; |
a29c33f4e userns: Convert s... |
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 Linux-2.6.12-rc2 |
82 |
|
a29c33f4e userns: Convert s... |
83 84 85 |
if (!(retval = put_user(rgid, rgidp)) && !(retval = put_user(egid, egidp))) retval = put_user(sgid, sgidp); |
1da177e4c Linux-2.6.12-rc2 |
86 87 88 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
89 |
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
90 |
{ |
2cf096668 make SYSCALL_DEFI... |
91 |
return sys_setfsuid(low2highuid(uid)); |
1da177e4c Linux-2.6.12-rc2 |
92 |
} |
a6b42e83f [CVE-2009-0029] S... |
93 |
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
94 |
{ |
2cf096668 make SYSCALL_DEFI... |
95 |
return sys_setfsgid(low2highgid(gid)); |
1da177e4c Linux-2.6.12-rc2 |
96 97 98 99 100 |
} static int groups16_to_user(old_gid_t __user *grouplist, struct group_info *group_info) { |
ae2975bc3 userns: Convert g... |
101 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c Linux-2.6.12-rc2 |
102 103 |
int i; old_gid_t group; |
ae2975bc3 userns: Convert g... |
104 |
kgid_t kgid; |
1da177e4c Linux-2.6.12-rc2 |
105 106 |
for (i = 0; i < group_info->ngroups; i++) { |
ae2975bc3 userns: Convert g... |
107 108 |
kgid = GROUP_AT(group_info, i); group = high2lowgid(from_kgid_munged(user_ns, kgid)); |
1da177e4c Linux-2.6.12-rc2 |
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 userns: Convert g... |
119 |
struct user_namespace *user_ns = current_user_ns(); |
1da177e4c Linux-2.6.12-rc2 |
120 121 |
int i; old_gid_t group; |
ae2975bc3 userns: Convert g... |
122 |
kgid_t kgid; |
1da177e4c Linux-2.6.12-rc2 |
123 124 125 126 |
for (i = 0; i < group_info->ngroups; i++) { if (get_user(group, grouplist+i)) return -EFAULT; |
ae2975bc3 userns: Convert g... |
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 Linux-2.6.12-rc2 |
133 134 135 136 |
} return 0; } |
003d7ab47 [CVE-2009-0029] S... |
137 |
SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
138 |
{ |
86a264abe CRED: Wrap curren... |
139 140 |
const struct cred *cred = current_cred(); int i; |
1da177e4c Linux-2.6.12-rc2 |
141 142 143 |
if (gidsetsize < 0) return -EINVAL; |
86a264abe CRED: Wrap curren... |
144 |
i = cred->group_info->ngroups; |
1da177e4c Linux-2.6.12-rc2 |
145 146 147 148 149 |
if (gidsetsize) { if (i > gidsetsize) { i = -EINVAL; goto out; } |
86a264abe CRED: Wrap curren... |
150 |
if (groups16_to_user(grouplist, cred->group_info)) { |
1da177e4c Linux-2.6.12-rc2 |
151 152 153 154 155 |
i = -EFAULT; goto out; } } out: |
1da177e4c Linux-2.6.12-rc2 |
156 157 |
return i; } |
003d7ab47 [CVE-2009-0029] S... |
158 |
SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
159 160 161 |
{ struct group_info *group_info; int retval; |
c7b96acf1 userns: Kill nso... |
162 |
if (!ns_capable(current_user_ns(), CAP_SETGID)) |
1da177e4c Linux-2.6.12-rc2 |
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 [CVE-2009-0029] S... |
181 |
SYSCALL_DEFINE0(getuid16) |
1da177e4c Linux-2.6.12-rc2 |
182 |
{ |
a29c33f4e userns: Convert s... |
183 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_uid())); |
1da177e4c Linux-2.6.12-rc2 |
184 |
} |
003d7ab47 [CVE-2009-0029] S... |
185 |
SYSCALL_DEFINE0(geteuid16) |
1da177e4c Linux-2.6.12-rc2 |
186 |
{ |
a29c33f4e userns: Convert s... |
187 |
return high2lowuid(from_kuid_munged(current_user_ns(), current_euid())); |
1da177e4c Linux-2.6.12-rc2 |
188 |
} |
003d7ab47 [CVE-2009-0029] S... |
189 |
SYSCALL_DEFINE0(getgid16) |
1da177e4c Linux-2.6.12-rc2 |
190 |
{ |
a29c33f4e userns: Convert s... |
191 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_gid())); |
1da177e4c Linux-2.6.12-rc2 |
192 |
} |
003d7ab47 [CVE-2009-0029] S... |
193 |
SYSCALL_DEFINE0(getegid16) |
1da177e4c Linux-2.6.12-rc2 |
194 |
{ |
a29c33f4e userns: Convert s... |
195 |
return high2lowgid(from_kgid_munged(current_user_ns(), current_egid())); |
1da177e4c Linux-2.6.12-rc2 |
196 |
} |