Blame view
kernel/uid16.c
5.28 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 |
{ |
5a7b46b36 [PATCH] Add more ... |
20 21 |
long ret = sys_chown(filename, low2highuid(user), low2highgid(group)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
22 |
asmlinkage_protect(3, ret, filename, user, group); |
5a7b46b36 [PATCH] Add more ... |
23 |
return ret; |
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 |
{ |
5a7b46b36 [PATCH] Add more ... |
27 28 |
long ret = sys_lchown(filename, low2highuid(user), low2highgid(group)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
29 |
asmlinkage_protect(3, ret, filename, user, group); |
5a7b46b36 [PATCH] Add more ... |
30 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
31 |
} |
ca013e945 [CVE-2009-0029] S... |
32 |
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) |
1da177e4c Linux-2.6.12-rc2 |
33 |
{ |
5a7b46b36 [PATCH] Add more ... |
34 35 |
long ret = sys_fchown(fd, low2highuid(user), low2highgid(group)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
36 |
asmlinkage_protect(3, ret, fd, user, group); |
5a7b46b36 [PATCH] Add more ... |
37 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
38 |
} |
a6b42e83f [CVE-2009-0029] S... |
39 |
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) |
1da177e4c Linux-2.6.12-rc2 |
40 |
{ |
5a7b46b36 [PATCH] Add more ... |
41 42 |
long ret = sys_setregid(low2highgid(rgid), low2highgid(egid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
43 |
asmlinkage_protect(2, ret, rgid, egid); |
5a7b46b36 [PATCH] Add more ... |
44 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
45 |
} |
a6b42e83f [CVE-2009-0029] S... |
46 |
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
47 |
{ |
5a7b46b36 [PATCH] Add more ... |
48 49 |
long ret = sys_setgid(low2highgid(gid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
50 |
asmlinkage_protect(1, ret, gid); |
5a7b46b36 [PATCH] Add more ... |
51 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
52 |
} |
a6b42e83f [CVE-2009-0029] S... |
53 |
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) |
1da177e4c Linux-2.6.12-rc2 |
54 |
{ |
5a7b46b36 [PATCH] Add more ... |
55 56 |
long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
57 |
asmlinkage_protect(2, ret, ruid, euid); |
5a7b46b36 [PATCH] Add more ... |
58 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
59 |
} |
a6b42e83f [CVE-2009-0029] S... |
60 |
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
61 |
{ |
5a7b46b36 [PATCH] Add more ... |
62 63 |
long ret = sys_setuid(low2highuid(uid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
64 |
asmlinkage_protect(1, ret, uid); |
5a7b46b36 [PATCH] Add more ... |
65 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
66 |
} |
a6b42e83f [CVE-2009-0029] S... |
67 |
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) |
1da177e4c Linux-2.6.12-rc2 |
68 |
{ |
5a7b46b36 [PATCH] Add more ... |
69 70 71 |
long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid), low2highuid(suid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
72 |
asmlinkage_protect(3, ret, ruid, euid, suid); |
5a7b46b36 [PATCH] Add more ... |
73 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
74 |
} |
a6b42e83f [CVE-2009-0029] S... |
75 |
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *, suid) |
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; |
86a264abe CRED: Wrap curren... |
79 80 81 |
if (!(retval = put_user(high2lowuid(cred->uid), ruid)) && !(retval = put_user(high2lowuid(cred->euid), euid))) retval = put_user(high2lowuid(cred->suid), suid); |
1da177e4c Linux-2.6.12-rc2 |
82 83 84 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
85 |
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) |
1da177e4c Linux-2.6.12-rc2 |
86 |
{ |
5a7b46b36 [PATCH] Add more ... |
87 88 89 |
long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid), low2highgid(sgid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
90 |
asmlinkage_protect(3, ret, rgid, egid, sgid); |
5a7b46b36 [PATCH] Add more ... |
91 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
92 |
} |
a6b42e83f [CVE-2009-0029] S... |
93 94 |
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgid, old_gid_t __user *, egid, old_gid_t __user *, sgid) |
1da177e4c Linux-2.6.12-rc2 |
95 |
{ |
86a264abe CRED: Wrap curren... |
96 |
const struct cred *cred = current_cred(); |
1da177e4c Linux-2.6.12-rc2 |
97 |
int retval; |
86a264abe CRED: Wrap curren... |
98 99 100 |
if (!(retval = put_user(high2lowgid(cred->gid), rgid)) && !(retval = put_user(high2lowgid(cred->egid), egid))) retval = put_user(high2lowgid(cred->sgid), sgid); |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 |
return retval; } |
a6b42e83f [CVE-2009-0029] S... |
104 |
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) |
1da177e4c Linux-2.6.12-rc2 |
105 |
{ |
5a7b46b36 [PATCH] Add more ... |
106 107 |
long ret = sys_setfsuid(low2highuid(uid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
108 |
asmlinkage_protect(1, ret, uid); |
5a7b46b36 [PATCH] Add more ... |
109 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
110 |
} |
a6b42e83f [CVE-2009-0029] S... |
111 |
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) |
1da177e4c Linux-2.6.12-rc2 |
112 |
{ |
5a7b46b36 [PATCH] Add more ... |
113 114 |
long ret = sys_setfsgid(low2highgid(gid)); /* avoid REGPARM breakage on x86: */ |
54a015104 asmlinkage_protec... |
115 |
asmlinkage_protect(1, ret, gid); |
5a7b46b36 [PATCH] Add more ... |
116 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
} static int groups16_to_user(old_gid_t __user *grouplist, struct group_info *group_info) { int i; old_gid_t group; for (i = 0; i < group_info->ngroups; i++) { group = high2lowgid(GROUP_AT(group_info, i)); 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) { int i; old_gid_t group; for (i = 0; i < group_info->ngroups; i++) { if (get_user(group, grouplist+i)) return -EFAULT; GROUP_AT(group_info, i) = low2highgid(group); } return 0; } |
003d7ab47 [CVE-2009-0029] S... |
148 |
SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
149 |
{ |
86a264abe CRED: Wrap curren... |
150 151 |
const struct cred *cred = current_cred(); int i; |
1da177e4c Linux-2.6.12-rc2 |
152 153 154 |
if (gidsetsize < 0) return -EINVAL; |
86a264abe CRED: Wrap curren... |
155 |
i = cred->group_info->ngroups; |
1da177e4c Linux-2.6.12-rc2 |
156 157 158 159 160 |
if (gidsetsize) { if (i > gidsetsize) { i = -EINVAL; goto out; } |
86a264abe CRED: Wrap curren... |
161 |
if (groups16_to_user(grouplist, cred->group_info)) { |
1da177e4c Linux-2.6.12-rc2 |
162 163 164 165 166 |
i = -EFAULT; goto out; } } out: |
1da177e4c Linux-2.6.12-rc2 |
167 168 |
return i; } |
003d7ab47 [CVE-2009-0029] S... |
169 |
SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) |
1da177e4c Linux-2.6.12-rc2 |
170 171 172 |
{ struct group_info *group_info; int retval; |
b0e77598f userns: user name... |
173 |
if (!nsown_capable(CAP_SETGID)) |
1da177e4c Linux-2.6.12-rc2 |
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
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... |
192 |
SYSCALL_DEFINE0(getuid16) |
1da177e4c Linux-2.6.12-rc2 |
193 |
{ |
86a264abe CRED: Wrap curren... |
194 |
return high2lowuid(current_uid()); |
1da177e4c Linux-2.6.12-rc2 |
195 |
} |
003d7ab47 [CVE-2009-0029] S... |
196 |
SYSCALL_DEFINE0(geteuid16) |
1da177e4c Linux-2.6.12-rc2 |
197 |
{ |
86a264abe CRED: Wrap curren... |
198 |
return high2lowuid(current_euid()); |
1da177e4c Linux-2.6.12-rc2 |
199 |
} |
003d7ab47 [CVE-2009-0029] S... |
200 |
SYSCALL_DEFINE0(getgid16) |
1da177e4c Linux-2.6.12-rc2 |
201 |
{ |
86a264abe CRED: Wrap curren... |
202 |
return high2lowgid(current_gid()); |
1da177e4c Linux-2.6.12-rc2 |
203 |
} |
003d7ab47 [CVE-2009-0029] S... |
204 |
SYSCALL_DEFINE0(getegid16) |
1da177e4c Linux-2.6.12-rc2 |
205 |
{ |
86a264abe CRED: Wrap curren... |
206 |
return high2lowgid(current_egid()); |
1da177e4c Linux-2.6.12-rc2 |
207 |
} |