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/smp_lock.h>
10 #include <linux/notifier.h>
11 #include <linux/reboot.h>
12 #include <linux/prctl.h>
13 #include <linux/init.h>
14 #include <linux/highuid.h>
15 #include <linux/security.h>
17 #include <asm/uaccess.h>
19 extern asmlinkage
long sys_chown(const char *, uid_t
,gid_t
);
20 extern asmlinkage
long sys_lchown(const char *, uid_t
,gid_t
);
21 extern asmlinkage
long sys_fchown(unsigned int, uid_t
,gid_t
);
22 extern asmlinkage
long sys_setregid(gid_t
, gid_t
);
23 extern asmlinkage
long sys_setgid(gid_t
);
24 extern asmlinkage
long sys_setreuid(uid_t
, uid_t
);
25 extern asmlinkage
long sys_setuid(uid_t
);
26 extern asmlinkage
long sys_setresuid(uid_t
, uid_t
, uid_t
);
27 extern asmlinkage
long sys_setresgid(gid_t
, gid_t
, gid_t
);
28 extern asmlinkage
long sys_setfsuid(uid_t
);
29 extern asmlinkage
long sys_setfsgid(gid_t
);
31 asmlinkage
long sys_chown16(const char * filename
, old_uid_t user
, old_gid_t group
)
33 return sys_chown(filename
, low2highuid(user
), low2highgid(group
));
36 asmlinkage
long sys_lchown16(const char * filename
, old_uid_t user
, old_gid_t group
)
38 return sys_lchown(filename
, low2highuid(user
), low2highgid(group
));
41 asmlinkage
long sys_fchown16(unsigned int fd
, old_uid_t user
, old_gid_t group
)
43 return sys_fchown(fd
, low2highuid(user
), low2highgid(group
));
46 asmlinkage
long sys_setregid16(old_gid_t rgid
, old_gid_t egid
)
48 return sys_setregid(low2highgid(rgid
), low2highgid(egid
));
51 asmlinkage
long sys_setgid16(old_gid_t gid
)
53 return sys_setgid((gid_t
)gid
);
56 asmlinkage
long sys_setreuid16(old_uid_t ruid
, old_uid_t euid
)
58 return sys_setreuid(low2highuid(ruid
), low2highuid(euid
));
61 asmlinkage
long sys_setuid16(old_uid_t uid
)
63 return sys_setuid((uid_t
)uid
);
66 asmlinkage
long sys_setresuid16(old_uid_t ruid
, old_uid_t euid
, old_uid_t suid
)
68 return sys_setresuid(low2highuid(ruid
), low2highuid(euid
),
72 asmlinkage
long sys_getresuid16(old_uid_t
*ruid
, old_uid_t
*euid
, old_uid_t
*suid
)
76 if (!(retval
= put_user(high2lowuid(current
->uid
), ruid
)) &&
77 !(retval
= put_user(high2lowuid(current
->euid
), euid
)))
78 retval
= put_user(high2lowuid(current
->suid
), suid
);
83 asmlinkage
long sys_setresgid16(old_gid_t rgid
, old_gid_t egid
, old_gid_t sgid
)
85 return sys_setresgid(low2highgid(rgid
), low2highgid(egid
),
89 asmlinkage
long sys_getresgid16(old_gid_t
*rgid
, old_gid_t
*egid
, old_gid_t
*sgid
)
93 if (!(retval
= put_user(high2lowgid(current
->gid
), rgid
)) &&
94 !(retval
= put_user(high2lowgid(current
->egid
), egid
)))
95 retval
= put_user(high2lowgid(current
->sgid
), sgid
);
100 asmlinkage
long sys_setfsuid16(old_uid_t uid
)
102 return sys_setfsuid((uid_t
)uid
);
105 asmlinkage
long sys_setfsgid16(old_gid_t gid
)
107 return sys_setfsgid((gid_t
)gid
);
110 asmlinkage
long sys_getgroups16(int gidsetsize
, old_gid_t
*grouplist
)
112 old_gid_t groups
[NGROUPS
];
117 i
= current
->ngroups
;
122 groups
[j
] = current
->groups
[j
];
123 if (copy_to_user(grouplist
, groups
, sizeof(old_gid_t
)*i
))
129 asmlinkage
long sys_setgroups16(int gidsetsize
, old_gid_t
*grouplist
)
131 old_gid_t groups
[NGROUPS
];
132 gid_t new_groups
[NGROUPS
];
135 if (!capable(CAP_SETGID
))
137 if ((unsigned) gidsetsize
> NGROUPS
)
139 if (copy_from_user(groups
, grouplist
, gidsetsize
* sizeof(old_gid_t
)))
141 for (i
= 0 ; i
< gidsetsize
; i
++)
142 new_groups
[i
] = (gid_t
)groups
[i
];
143 i
= security_ops
->task_setgroups(gidsetsize
, new_groups
);
146 memcpy(current
->groups
, new_groups
, gidsetsize
* sizeof(gid_t
));
147 current
->ngroups
= gidsetsize
;
151 asmlinkage
long sys_getuid16(void)
153 return high2lowuid(current
->uid
);
156 asmlinkage
long sys_geteuid16(void)
158 return high2lowuid(current
->euid
);
161 asmlinkage
long sys_getgid16(void)
163 return high2lowgid(current
->gid
);
166 asmlinkage
long sys_getegid16(void)
168 return high2lowgid(current
->egid
);