Blame view

kernel/uid16.c 5.28 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
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
75
  SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *, suid)
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;
86a264abe   David Howells   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   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
85
  SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
87
88
89
  	long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
  				 low2highgid(sgid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
90
  	asmlinkage_protect(3, ret, rgid, egid, sgid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
91
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  }
a6b42e83f   Heiko Carstens   [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   Linus Torvalds   Linux-2.6.12-rc2
95
  {
86a264abe   David Howells   CRED: Wrap curren...
96
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  	int retval;
86a264abe   David Howells   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   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
104
  SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
106
107
  	long ret = sys_setfsuid(low2highuid(uid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
108
  	asmlinkage_protect(1, ret, uid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
109
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
111
  SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  {
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
113
114
  	long ret = sys_setfsgid(low2highgid(gid));
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
115
  	asmlinkage_protect(1, ret, gid);
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
116
  	return ret;
1da177e4c   Linus Torvalds   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   Heiko Carstens   [CVE-2009-0029] S...
148
  SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  {
86a264abe   David Howells   CRED: Wrap curren...
150
151
  	const struct cred *cred = current_cred();
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
  
  	if (gidsetsize < 0)
  		return -EINVAL;
86a264abe   David Howells   CRED: Wrap curren...
155
  	i = cred->group_info->ngroups;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
158
159
160
  	if (gidsetsize) {
  		if (i > gidsetsize) {
  			i = -EINVAL;
  			goto out;
  		}
86a264abe   David Howells   CRED: Wrap curren...
161
  		if (groups16_to_user(grouplist, cred->group_info)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
164
165
166
  			i = -EFAULT;
  			goto out;
  		}
  	}
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
  	return i;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
169
  SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
172
  {
  	struct group_info *group_info;
  	int retval;
b0e77598f   Serge E. Hallyn   userns: user name...
173
  	if (!nsown_capable(CAP_SETGID))
1da177e4c   Linus Torvalds   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   Heiko Carstens   [CVE-2009-0029] S...
192
  SYSCALL_DEFINE0(getuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
  {
86a264abe   David Howells   CRED: Wrap curren...
194
  	return high2lowuid(current_uid());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
196
  SYSCALL_DEFINE0(geteuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
  {
86a264abe   David Howells   CRED: Wrap curren...
198
  	return high2lowuid(current_euid());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
200
  SYSCALL_DEFINE0(getgid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  {
86a264abe   David Howells   CRED: Wrap curren...
202
  	return high2lowgid(current_gid());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
204
  SYSCALL_DEFINE0(getegid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  {
86a264abe   David Howells   CRED: Wrap curren...
206
  	return high2lowgid(current_egid());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  }