git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
PM: Wait for console in resume
[safe/jmp/linux-2.6]
/
kernel
/
uid16.c
diff --git
a/kernel/uid16.c
b/kernel/uid16.c
index
f669941
..
0314501
100644
(file)
--- a/
kernel/uid16.c
+++ b/
kernel/uid16.c
@@
-6,10
+6,10
@@
#include <linux/mm.h>
#include <linux/utsname.h>
#include <linux/mman.h>
#include <linux/mm.h>
#include <linux/utsname.h>
#include <linux/mman.h>
-#include <linux/smp_lock.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/prctl.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/prctl.h>
+#include <linux/capability.h>
#include <linux/init.h>
#include <linux/highuid.h>
#include <linux/security.h>
#include <linux/init.h>
#include <linux/highuid.h>
#include <linux/security.h>
@@
-17,83
+17,119
@@
#include <asm/uaccess.h>
#include <asm/uaccess.h>
-
asmlinkage long sys_chown16(const char __user * filename, old_uid_t user, old_gid_t
group)
+
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t,
group)
{
{
- return sys_chown(filename, low2highuid(user), low2highgid(group));
+ long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(3, ret, filename, user, group);
+ return ret;
}
}
-
asmlinkage long sys_lchown16(const char __user * filename, old_uid_t user, old_gid_t
group)
+
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t,
group)
{
{
- return sys_lchown(filename, low2highuid(user), low2highgid(group));
+ long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(3, ret, filename, user, group);
+ return ret;
}
}
-
asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t
group)
+
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t,
group)
{
{
- return sys_fchown(fd, low2highuid(user), low2highgid(group));
+ long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(3, ret, fd, user, group);
+ return ret;
}
}
-
asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t
egid)
+
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t,
egid)
{
{
- return sys_setregid(low2highgid(rgid), low2highgid(egid));
+ long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(2, ret, rgid, egid);
+ return ret;
}
}
-
asmlinkage long sys_setgid16(old_gid_t
gid)
+
SYSCALL_DEFINE1(setgid16, old_gid_t,
gid)
{
{
- return sys_setgid(low2highgid(gid));
+ long ret = sys_setgid(low2highgid(gid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(1, ret, gid);
+ return ret;
}
}
-
asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t
euid)
+
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t,
euid)
{
{
- return sys_setreuid(low2highuid(ruid), low2highuid(euid));
+ long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(2, ret, ruid, euid);
+ return ret;
}
}
-
asmlinkage long sys_setuid16(old_uid_t
uid)
+
SYSCALL_DEFINE1(setuid16, old_uid_t,
uid)
{
{
- return sys_setuid(low2highuid(uid));
+ long ret = sys_setuid(low2highuid(uid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(1, ret, uid);
+ return ret;
}
}
-
asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t
suid)
+
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t,
suid)
{
{
- return sys_setresuid(low2highuid(ruid), low2highuid(euid),
- low2highuid(suid));
+ long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
+ low2highuid(suid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(3, ret, ruid, euid, suid);
+ return ret;
}
}
-
asmlinkage long sys_getresuid16(old_uid_t __user *ruid, old_uid_t __user *euid, old_uid_t __user *
suid)
+
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *,
suid)
{
{
+ const struct cred *cred = current_cred();
int retval;
int retval;
- if (!(retval
= put_user(high2lowuid(current->uid),
ruid)) &&
- !(retval
= put_user(high2lowuid(current
->euid), euid)))
- retval = put_user(high2lowuid(c
urrent
->suid), suid);
+ if (!(retval
= put_user(high2lowuid(cred->uid),
ruid)) &&
+ !(retval
= put_user(high2lowuid(cred
->euid), euid)))
+ retval = put_user(high2lowuid(c
red
->suid), suid);
return retval;
}
return retval;
}
-
asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t
sgid)
+
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t,
sgid)
{
{
- return sys_setresgid(low2highgid(rgid), low2highgid(egid),
- low2highgid(sgid));
+ long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
+ low2highgid(sgid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(3, ret, rgid, egid, sgid);
+ return ret;
}
}
-asmlinkage long sys_getresgid16(old_gid_t __user *rgid, old_gid_t __user *egid, old_gid_t __user *sgid)
+
+SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgid, old_gid_t __user *, egid, old_gid_t __user *, sgid)
{
{
+ const struct cred *cred = current_cred();
int retval;
int retval;
- if (!(retval
= put_user(high2lowgid(current->gid),
rgid)) &&
- !(retval
= put_user(high2lowgid(current
->egid), egid)))
- retval = put_user(high2lowgid(c
urrent
->sgid), sgid);
+ if (!(retval
= put_user(high2lowgid(cred->gid),
rgid)) &&
+ !(retval
= put_user(high2lowgid(cred
->egid), egid)))
+ retval = put_user(high2lowgid(c
red
->sgid), sgid);
return retval;
}
return retval;
}
-
asmlinkage long sys_setfsuid16(old_uid_t
uid)
+
SYSCALL_DEFINE1(setfsuid16, old_uid_t,
uid)
{
{
- return sys_setfsuid(low2highuid(uid));
+ long ret = sys_setfsuid(low2highuid(uid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(1, ret, uid);
+ return ret;
}
}
-
asmlinkage long sys_setfsgid16(old_gid_t
gid)
+
SYSCALL_DEFINE1(setfsgid16, old_gid_t,
gid)
{
{
- return sys_setfsgid(low2highgid(gid));
+ long ret = sys_setfsgid(low2highgid(gid));
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(1, ret, gid);
+ return ret;
}
static int groups16_to_user(old_gid_t __user *grouplist,
}
static int groups16_to_user(old_gid_t __user *grouplist,
@@
-126,31
+162,30
@@
static int groups16_from_user(struct group_info *group_info,
return 0;
}
return 0;
}
-
asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t __user *
grouplist)
+
SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *,
grouplist)
{
{
- int i = 0;
+ const struct cred *cred = current_cred();
+ int i;
if (gidsetsize < 0)
return -EINVAL;
if (gidsetsize < 0)
return -EINVAL;
- get_group_info(current->group_info);
- i = current->group_info->ngroups;
+ i = cred->group_info->ngroups;
if (gidsetsize) {
if (i > gidsetsize) {
i = -EINVAL;
goto out;
}
if (gidsetsize) {
if (i > gidsetsize) {
i = -EINVAL;
goto out;
}
- if (groups16_to_user(grouplist, c
urrent
->group_info)) {
+ if (groups16_to_user(grouplist, c
red
->group_info)) {
i = -EFAULT;
goto out;
}
}
out:
i = -EFAULT;
goto out;
}
}
out:
- put_group_info(current->group_info);
return i;
}
return i;
}
-
asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t __user *
grouplist)
+
SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *,
grouplist)
{
struct group_info *group_info;
int retval;
{
struct group_info *group_info;
int retval;
@@
-175,22
+210,22
@@
asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t __user *grouplist)
return retval;
}
return retval;
}
-
asmlinkage long sys_getuid16(void
)
+
SYSCALL_DEFINE0(getuid16
)
{
{
- return high2lowuid(current
->uid
);
+ return high2lowuid(current
_uid()
);
}
}
-
asmlinkage long sys_geteuid16(void
)
+
SYSCALL_DEFINE0(geteuid16
)
{
{
- return high2lowuid(current
->euid
);
+ return high2lowuid(current
_euid()
);
}
}
-
asmlinkage long sys_getgid16(void
)
+
SYSCALL_DEFINE0(getgid16
)
{
{
- return high2lowgid(current
->gid
);
+ return high2lowgid(current
_gid()
);
}
}
-
asmlinkage long sys_getegid16(void
)
+
SYSCALL_DEFINE0(getegid16
)
{
{
- return high2lowgid(current
->egid
);
+ return high2lowgid(current
_egid()
);
}
}