Blame view

kernel/uid16.c 4.96 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
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
20
  	return sys_chown(filename, low2highuid(user), low2highgid(group));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  }
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
22
  SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
24
  	return sys_lchown(filename, low2highuid(user), low2highgid(group));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  }
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
26
  SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
28
  	return sys_fchown(fd, low2highuid(user), low2highgid(group));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
30
  SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
32
  	return sys_setregid(low2highgid(rgid), low2highgid(egid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
34
  SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
36
  	return sys_setgid(low2highgid(gid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
38
  SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
40
  	return sys_setreuid(low2highuid(ruid), low2highuid(euid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
42
  SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
44
  	return sys_setuid(low2highuid(uid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
46
  SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
48
  	return sys_setresuid(low2highuid(ruid), low2highuid(euid),
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
49
  				 low2highuid(suid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  }
a29c33f4e   Eric W. Biederman   userns: Convert s...
51
  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
52
  {
86a264abe   David Howells   CRED: Wrap curren...
53
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  	int retval;
a29c33f4e   Eric W. Biederman   userns: Convert s...
55
  	old_uid_t ruid, euid, suid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56

a29c33f4e   Eric W. Biederman   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   Linus Torvalds   Linux-2.6.12-rc2
64
65
66
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
67
  SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
69
  	return sys_setresgid(low2highgid(rgid), low2highgid(egid),
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
70
  				 low2highgid(sgid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
72

a29c33f4e   Eric W. Biederman   userns: Convert s...
73
  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
74
  {
86a264abe   David Howells   CRED: Wrap curren...
75
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  	int retval;
a29c33f4e   Eric W. Biederman   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   Linus Torvalds   Linux-2.6.12-rc2
82

a29c33f4e   Eric W. Biederman   userns: Convert s...
83
84
85
  	if (!(retval   = put_user(rgid, rgidp)) &&
  	    !(retval   = put_user(egid, egidp)))
  		retval = put_user(sgid, sgidp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
89
  SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
91
  	return sys_setfsuid(low2highuid(uid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
93
  SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  {
2cf096668   Al Viro   make SYSCALL_DEFI...
95
  	return sys_setfsgid(low2highgid(gid));
1da177e4c   Linus Torvalds   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   Eric W. Biederman   userns: Convert g...
101
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
104
  	kgid_t kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
  
  	for (i = 0; i < group_info->ngroups; i++) {
ae2975bc3   Eric W. Biederman   userns: Convert g...
107
108
  		kgid = GROUP_AT(group_info, i);
  		group = high2lowgid(from_kgid_munged(user_ns, kgid));
1da177e4c   Linus Torvalds   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   Eric W. Biederman   userns: Convert g...
119
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
122
  	kgid_t kgid;
1da177e4c   Linus Torvalds   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   Eric W. Biederman   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   Linus Torvalds   Linux-2.6.12-rc2
133
134
135
136
  	}
  
  	return 0;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
137
  SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  {
86a264abe   David Howells   CRED: Wrap curren...
139
140
  	const struct cred *cred = current_cred();
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
  
  	if (gidsetsize < 0)
  		return -EINVAL;
86a264abe   David Howells   CRED: Wrap curren...
144
  	i = cred->group_info->ngroups;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
148
149
  	if (gidsetsize) {
  		if (i > gidsetsize) {
  			i = -EINVAL;
  			goto out;
  		}
86a264abe   David Howells   CRED: Wrap curren...
150
  		if (groups16_to_user(grouplist, cred->group_info)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
153
154
155
  			i = -EFAULT;
  			goto out;
  		}
  	}
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
  	return i;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
158
  SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
160
161
  {
  	struct group_info *group_info;
  	int retval;
7ff4d90b4   Eric W. Biederman   groups: Consolida...
162
  	if (!may_setgroups())
1da177e4c   Linus Torvalds   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   Heiko Carstens   [CVE-2009-0029] S...
181
  SYSCALL_DEFINE0(getuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
183
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_uid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
185
  SYSCALL_DEFINE0(geteuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
187
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_euid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
189
  SYSCALL_DEFINE0(getgid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
190
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
191
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_gid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
193
  SYSCALL_DEFINE0(getegid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
195
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
  }