Blame view

kernel/uid16.c 6.01 KB
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <linux/mman.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
  #include <linux/notifier.h>
  #include <linux/reboot.h>
  #include <linux/prctl.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
11
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   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   Heiko Carstens   [CVE-2009-0029] S...
18
  SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
20
21
  	long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
22
  	asmlinkage_protect(3, ret, filename, user, group);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
23
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  }
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
25
  SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
27
28
  	long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
29
  	asmlinkage_protect(3, ret, filename, user, group);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
30
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  }
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
32
  SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
34
35
  	long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
36
  	asmlinkage_protect(3, ret, fd, user, group);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
37
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
39
  SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
41
42
  	long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
43
  	asmlinkage_protect(2, ret, rgid, egid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
44
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
46
  SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
48
49
  	long ret = sys_setgid(low2highgid(gid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
50
  	asmlinkage_protect(1, ret, gid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
51
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
53
  SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
55
56
  	long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
57
  	asmlinkage_protect(2, ret, ruid, euid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
58
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
60
  SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
62
63
  	long ret = sys_setuid(low2highuid(uid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
64
  	asmlinkage_protect(1, ret, uid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
65
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
67
  SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
69
70
71
  	long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
  				 low2highuid(suid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
72
  	asmlinkage_protect(3, ret, ruid, euid, suid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
73
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
  }
a29c33f4e   Eric W. Biederman   userns: Convert s...
75
  SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  {
86a264abe   David Howells   CRED: Wrap curren...
77
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  	int retval;
a29c33f4e   Eric W. Biederman   userns: Convert s...
79
  	old_uid_t ruid, euid, suid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80

a29c33f4e   Eric W. Biederman   userns: Convert s...
81
82
83
84
85
86
87
  	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   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
91
  SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
93
94
95
  	long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
  				 low2highgid(sgid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
96
  	asmlinkage_protect(3, ret, rgid, egid, sgid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
97
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
99

a29c33f4e   Eric W. Biederman   userns: Convert s...
100
  SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
  {
86a264abe   David Howells   CRED: Wrap curren...
102
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
  	int retval;
a29c33f4e   Eric W. Biederman   userns: Convert s...
104
105
106
107
108
  	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   Linus Torvalds   Linux-2.6.12-rc2
109

a29c33f4e   Eric W. Biederman   userns: Convert s...
110
111
112
  	if (!(retval   = put_user(rgid, rgidp)) &&
  	    !(retval   = put_user(egid, egidp)))
  		retval = put_user(sgid, sgidp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
116
  SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
118
119
  	long ret = sys_setfsuid(low2highuid(uid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
120
  	asmlinkage_protect(1, ret, uid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
121
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
123
  SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
125
126
  	long ret = sys_setfsgid(low2highgid(gid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
127
  	asmlinkage_protect(1, ret, gid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
128
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
  }
  
  static int groups16_to_user(old_gid_t __user *grouplist,
      struct group_info *group_info)
  {
ae2975bc3   Eric W. Biederman   userns: Convert g...
134
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
137
  	kgid_t kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
  
  	for (i = 0; i < group_info->ngroups; i++) {
ae2975bc3   Eric W. Biederman   userns: Convert g...
140
141
  		kgid = GROUP_AT(group_info, i);
  		group = high2lowgid(from_kgid_munged(user_ns, kgid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
145
146
147
148
149
150
151
  		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   Eric W. Biederman   userns: Convert g...
152
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
155
  	kgid_t kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
158
159
  
  	for (i = 0; i < group_info->ngroups; i++) {
  		if (get_user(group, grouplist+i))
  			return  -EFAULT;
ae2975bc3   Eric W. Biederman   userns: Convert g...
160
161
162
163
164
165
  
  		kgid = make_kgid(user_ns, low2highgid(group));
  		if (!gid_valid(kgid))
  			return -EINVAL;
  
  		GROUP_AT(group_info, i) = kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
  	}
  
  	return 0;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
170
  SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  {
86a264abe   David Howells   CRED: Wrap curren...
172
173
  	const struct cred *cred = current_cred();
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
  
  	if (gidsetsize < 0)
  		return -EINVAL;
86a264abe   David Howells   CRED: Wrap curren...
177
  	i = cred->group_info->ngroups;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
181
182
  	if (gidsetsize) {
  		if (i > gidsetsize) {
  			i = -EINVAL;
  			goto out;
  		}
86a264abe   David Howells   CRED: Wrap curren...
183
  		if (groups16_to_user(grouplist, cred->group_info)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
186
187
188
  			i = -EFAULT;
  			goto out;
  		}
  	}
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
  	return i;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
191
  SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
  {
  	struct group_info *group_info;
  	int retval;
b0e77598f   Serge E. Hallyn   userns: user name...
195
  	if (!nsown_capable(CAP_SETGID))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  		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   Heiko Carstens   [CVE-2009-0029] S...
214
  SYSCALL_DEFINE0(getuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
216
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_uid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
218
  SYSCALL_DEFINE0(geteuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
220
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_euid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
222
  SYSCALL_DEFINE0(getgid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
224
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_gid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
226
  SYSCALL_DEFINE0(getegid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
228
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
  }