Blame view

kernel/uid16.c 5.08 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
  /*
   *	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
8
  #include <linux/mman.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
  #include <linux/notifier.h>
  #include <linux/reboot.h>
  #include <linux/prctl.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
12
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
  #include <linux/init.h>
  #include <linux/highuid.h>
  #include <linux/security.h>
5b825c3af   Ingo Molnar   sched/headers: Pr...
16
  #include <linux/cred.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  #include <linux/syscalls.h>
7c0f6ba68   Linus Torvalds   Replace <asm/uacc...
18
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

e530dca58   Dominik Brodowski   kernel: provide k...
20
  #include "uid16.h"
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
21
  SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  {
55731b3cd   Dominik Brodowski   fs: add do_fchown...
23
  	return ksys_chown(filename, low2highuid(user), low2highgid(group));
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
  {
55731b3cd   Dominik Brodowski   fs: add do_fchown...
27
  	return ksys_lchown(filename, low2highuid(user), low2highgid(group));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  }
ca013e945   Heiko Carstens   [CVE-2009-0029] S...
29
  SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  {
55731b3cd   Dominik Brodowski   fs: add do_fchown...
31
  	return ksys_fchown(fd, low2highuid(user), low2highgid(group));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
33
  SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  {
e530dca58   Dominik Brodowski   kernel: provide k...
35
  	return __sys_setregid(low2highgid(rgid), low2highgid(egid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
37
  SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  {
e530dca58   Dominik Brodowski   kernel: provide k...
39
  	return __sys_setgid(low2highgid(gid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
41
  SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  {
e530dca58   Dominik Brodowski   kernel: provide k...
43
  	return __sys_setreuid(low2highuid(ruid), low2highuid(euid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
45
  SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  {
e530dca58   Dominik Brodowski   kernel: provide k...
47
  	return __sys_setuid(low2highuid(uid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
49
  SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  {
e530dca58   Dominik Brodowski   kernel: provide k...
51
  	return __sys_setresuid(low2highuid(ruid), low2highuid(euid),
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
52
  				 low2highuid(suid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  }
a29c33f4e   Eric W. Biederman   userns: Convert s...
54
  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
55
  {
86a264abe   David Howells   CRED: Wrap curren...
56
  	const struct cred *cred = current_cred();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  	int retval;
a29c33f4e   Eric W. Biederman   userns: Convert s...
58
  	old_uid_t ruid, euid, suid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59

a29c33f4e   Eric W. Biederman   userns: Convert s...
60
61
62
63
64
65
66
  	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
67
68
69
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
70
  SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  {
e530dca58   Dominik Brodowski   kernel: provide k...
72
  	return __sys_setresgid(low2highgid(rgid), low2highgid(egid),
5a7b46b36   OGAWA Hirofumi   [PATCH] Add more ...
73
  				 low2highgid(sgid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
  }
a29c33f4e   Eric W. Biederman   userns: Convert s...
75
  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
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
80
81
82
83
  	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
84

a29c33f4e   Eric W. Biederman   userns: Convert s...
85
86
87
  	if (!(retval   = put_user(rgid, rgidp)) &&
  	    !(retval   = put_user(egid, egidp)))
  		retval = put_user(sgid, sgidp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
  
  	return retval;
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
91
  SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  {
e530dca58   Dominik Brodowski   kernel: provide k...
93
  	return __sys_setfsuid(low2highuid(uid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  }
a6b42e83f   Heiko Carstens   [CVE-2009-0029] S...
95
  SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  {
e530dca58   Dominik Brodowski   kernel: provide k...
97
  	return __sys_setfsgid(low2highgid(gid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
101
102
  }
  
  static int groups16_to_user(old_gid_t __user *grouplist,
      struct group_info *group_info)
  {
ae2975bc3   Eric W. Biederman   userns: Convert g...
103
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
106
  	kgid_t kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  
  	for (i = 0; i < group_info->ngroups; i++) {
81243eacf   Alexey Dobriyan   cred: simpler, 1D...
109
  		kgid = group_info->gid[i];
ae2975bc3   Eric W. Biederman   userns: Convert g...
110
  		group = high2lowgid(from_kgid_munged(user_ns, kgid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
115
116
117
118
119
120
  		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...
121
  	struct user_namespace *user_ns = current_user_ns();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
  	int i;
  	old_gid_t group;
ae2975bc3   Eric W. Biederman   userns: Convert g...
124
  	kgid_t kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
  
  	for (i = 0; i < group_info->ngroups; i++) {
  		if (get_user(group, grouplist+i))
  			return  -EFAULT;
ae2975bc3   Eric W. Biederman   userns: Convert g...
129
130
131
132
  
  		kgid = make_kgid(user_ns, low2highgid(group));
  		if (!gid_valid(kgid))
  			return -EINVAL;
81243eacf   Alexey Dobriyan   cred: simpler, 1D...
133
  		group_info->gid[i] = kgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
  	}
  
  	return 0;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
138
  SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
  {
86a264abe   David Howells   CRED: Wrap curren...
140
141
  	const struct cred *cred = current_cred();
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
  
  	if (gidsetsize < 0)
  		return -EINVAL;
86a264abe   David Howells   CRED: Wrap curren...
145
  	i = cred->group_info->ngroups;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
148
149
150
  	if (gidsetsize) {
  		if (i > gidsetsize) {
  			i = -EINVAL;
  			goto out;
  		}
86a264abe   David Howells   CRED: Wrap curren...
151
  		if (groups16_to_user(grouplist, cred->group_info)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
156
  			i = -EFAULT;
  			goto out;
  		}
  	}
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
  	return i;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
159
  SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
  {
  	struct group_info *group_info;
  	int retval;
7ff4d90b4   Eric W. Biederman   groups: Consolida...
163
  	if (!may_setgroups())
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
167
168
169
170
171
172
173
174
175
  		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;
  	}
bdcf0a423   Thiago Rafael Becker   kernel: make grou...
176
  	groups_sort(group_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
  	retval = set_current_groups(group_info);
  	put_group_info(group_info);
  
  	return retval;
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
182
  SYSCALL_DEFINE0(getuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
184
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_uid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
186
  SYSCALL_DEFINE0(geteuid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
188
  	return high2lowuid(from_kuid_munged(current_user_ns(), current_euid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
190
  SYSCALL_DEFINE0(getgid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
192
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_gid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
  }
003d7ab47   Heiko Carstens   [CVE-2009-0029] S...
194
  SYSCALL_DEFINE0(getegid16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  {
a29c33f4e   Eric W. Biederman   userns: Convert s...
196
  	return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
  }