2 * Wrapper functions for 16bit uid back compatibility. All nicely tied
3 * together in the faint hope we can take the out in five years time.
7 #include <linux/utsname.h>
8 #include <linux/mman.h>
9 #include <linux/notifier.h>
10 #include <linux/reboot.h>
11 #include <linux/prctl.h>
12 #include <linux/capability.h>
13 #include <linux/init.h>
14 #include <linux/highuid.h>
15 #include <linux/security.h>
16 #include <linux/syscalls.h>
18 #include <asm/uaccess.h>
20 asmlinkage
long sys_chown16(const char __user
* filename
, old_uid_t user
, old_gid_t group
)
22 long ret
= sys_chown(filename
, low2highuid(user
), low2highgid(group
));
23 /* avoid REGPARM breakage on x86: */
24 asmlinkage_protect(3, ret
, filename
, user
, group
);
28 asmlinkage
long sys_lchown16(const char __user
* filename
, old_uid_t user
, old_gid_t group
)
30 long ret
= sys_lchown(filename
, low2highuid(user
), low2highgid(group
));
31 /* avoid REGPARM breakage on x86: */
32 asmlinkage_protect(3, ret
, filename
, user
, group
);
36 asmlinkage
long sys_fchown16(unsigned int fd
, old_uid_t user
, old_gid_t group
)
38 long ret
= sys_fchown(fd
, low2highuid(user
), low2highgid(group
));
39 /* avoid REGPARM breakage on x86: */
40 asmlinkage_protect(3, ret
, fd
, user
, group
);
44 asmlinkage
long sys_setregid16(old_gid_t rgid
, old_gid_t egid
)
46 long ret
= sys_setregid(low2highgid(rgid
), low2highgid(egid
));
47 /* avoid REGPARM breakage on x86: */
48 asmlinkage_protect(2, ret
, rgid
, egid
);
52 asmlinkage
long sys_setgid16(old_gid_t gid
)
54 long ret
= sys_setgid(low2highgid(gid
));
55 /* avoid REGPARM breakage on x86: */
56 asmlinkage_protect(1, ret
, gid
);
60 asmlinkage
long sys_setreuid16(old_uid_t ruid
, old_uid_t euid
)
62 long ret
= sys_setreuid(low2highuid(ruid
), low2highuid(euid
));
63 /* avoid REGPARM breakage on x86: */
64 asmlinkage_protect(2, ret
, ruid
, euid
);
68 asmlinkage
long sys_setuid16(old_uid_t uid
)
70 long ret
= sys_setuid(low2highuid(uid
));
71 /* avoid REGPARM breakage on x86: */
72 asmlinkage_protect(1, ret
, uid
);
76 asmlinkage
long sys_setresuid16(old_uid_t ruid
, old_uid_t euid
, old_uid_t suid
)
78 long ret
= sys_setresuid(low2highuid(ruid
), low2highuid(euid
),
80 /* avoid REGPARM breakage on x86: */
81 asmlinkage_protect(3, ret
, ruid
, euid
, suid
);
85 asmlinkage
long sys_getresuid16(old_uid_t __user
*ruid
, old_uid_t __user
*euid
, old_uid_t __user
*suid
)
87 const struct cred
*cred
= current_cred();
90 if (!(retval
= put_user(high2lowuid(cred
->uid
), ruid
)) &&
91 !(retval
= put_user(high2lowuid(cred
->euid
), euid
)))
92 retval
= put_user(high2lowuid(cred
->suid
), suid
);
97 asmlinkage
long sys_setresgid16(old_gid_t rgid
, old_gid_t egid
, old_gid_t sgid
)
99 long ret
= sys_setresgid(low2highgid(rgid
), low2highgid(egid
),
101 /* avoid REGPARM breakage on x86: */
102 asmlinkage_protect(3, ret
, rgid
, egid
, sgid
);
106 asmlinkage
long sys_getresgid16(old_gid_t __user
*rgid
, old_gid_t __user
*egid
, old_gid_t __user
*sgid
)
108 const struct cred
*cred
= current_cred();
111 if (!(retval
= put_user(high2lowgid(cred
->gid
), rgid
)) &&
112 !(retval
= put_user(high2lowgid(cred
->egid
), egid
)))
113 retval
= put_user(high2lowgid(cred
->sgid
), sgid
);
118 asmlinkage
long sys_setfsuid16(old_uid_t uid
)
120 long ret
= sys_setfsuid(low2highuid(uid
));
121 /* avoid REGPARM breakage on x86: */
122 asmlinkage_protect(1, ret
, uid
);
126 asmlinkage
long sys_setfsgid16(old_gid_t gid
)
128 long ret
= sys_setfsgid(low2highgid(gid
));
129 /* avoid REGPARM breakage on x86: */
130 asmlinkage_protect(1, ret
, gid
);
134 static int groups16_to_user(old_gid_t __user
*grouplist
,
135 struct group_info
*group_info
)
140 for (i
= 0; i
< group_info
->ngroups
; i
++) {
141 group
= high2lowgid(GROUP_AT(group_info
, i
));
142 if (put_user(group
, grouplist
+i
))
149 static int groups16_from_user(struct group_info
*group_info
,
150 old_gid_t __user
*grouplist
)
155 for (i
= 0; i
< group_info
->ngroups
; i
++) {
156 if (get_user(group
, grouplist
+i
))
158 GROUP_AT(group_info
, i
) = low2highgid(group
);
164 asmlinkage
long sys_getgroups16(int gidsetsize
, old_gid_t __user
*grouplist
)
166 const struct cred
*cred
= current_cred();
172 i
= cred
->group_info
->ngroups
;
174 if (i
> gidsetsize
) {
178 if (groups16_to_user(grouplist
, cred
->group_info
)) {
187 asmlinkage
long sys_setgroups16(int gidsetsize
, old_gid_t __user
*grouplist
)
189 struct group_info
*group_info
;
192 if (!capable(CAP_SETGID
))
194 if ((unsigned)gidsetsize
> NGROUPS_MAX
)
197 group_info
= groups_alloc(gidsetsize
);
200 retval
= groups16_from_user(group_info
, grouplist
);
202 put_group_info(group_info
);
206 retval
= set_current_groups(group_info
);
207 put_group_info(group_info
);
212 asmlinkage
long sys_getuid16(void)
214 return high2lowuid(current_uid());
217 asmlinkage
long sys_geteuid16(void)
219 return high2lowuid(current_euid());
222 asmlinkage
long sys_getgid16(void)
224 return high2lowgid(current_gid());
227 asmlinkage
long sys_getegid16(void)
229 return high2lowgid(current_egid());