coredump masking: reimplementation of dumpable using two flags
This patch changes mm_struct.dumpable to a pair of bit flags. set_dumpable() converts three-value dumpable to two flags and stores it into lower two bits of mm_struct.flags instead of mm_struct.dumpable. get_dumpable() behaves in the opposite way. [akpm@linux-foundation.org: export set_dumpable] Signed-off-by: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: David Howells <dhowells@redhat.com> Cc: Hugh Dickins <hugh@veritas.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
76fdbb25f9
commit
6c5d523826
@@ -142,7 +142,7 @@ static int may_attach(struct task_struct *task)
|
||||
return -EPERM;
|
||||
smp_rmb();
|
||||
if (task->mm)
|
||||
dumpable = task->mm->dumpable;
|
||||
dumpable = get_dumpable(task->mm);
|
||||
if (!dumpable && !capable(CAP_SYS_PTRACE))
|
||||
return -EPERM;
|
||||
|
||||
|
24
kernel/sys.c
24
kernel/sys.c
@@ -1036,7 +1036,7 @@ asmlinkage long sys_setregid(gid_t rgid, gid_t egid)
|
||||
return -EPERM;
|
||||
}
|
||||
if (new_egid != old_egid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
if (rgid != (gid_t) -1 ||
|
||||
@@ -1066,13 +1066,13 @@ asmlinkage long sys_setgid(gid_t gid)
|
||||
|
||||
if (capable(CAP_SETGID)) {
|
||||
if (old_egid != gid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->gid = current->egid = current->sgid = current->fsgid = gid;
|
||||
} else if ((gid == current->gid) || (gid == current->sgid)) {
|
||||
if (old_egid != gid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->egid = current->fsgid = gid;
|
||||
@@ -1103,7 +1103,7 @@ static int set_user(uid_t new_ruid, int dumpclear)
|
||||
switch_uid(new_user);
|
||||
|
||||
if (dumpclear) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->uid = new_ruid;
|
||||
@@ -1159,7 +1159,7 @@ asmlinkage long sys_setreuid(uid_t ruid, uid_t euid)
|
||||
return -EAGAIN;
|
||||
|
||||
if (new_euid != old_euid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->fsuid = current->euid = new_euid;
|
||||
@@ -1209,7 +1209,7 @@ asmlinkage long sys_setuid(uid_t uid)
|
||||
return -EPERM;
|
||||
|
||||
if (old_euid != uid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->fsuid = current->euid = uid;
|
||||
@@ -1254,7 +1254,7 @@ asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
|
||||
}
|
||||
if (euid != (uid_t) -1) {
|
||||
if (euid != current->euid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->euid = euid;
|
||||
@@ -1304,7 +1304,7 @@ asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
|
||||
}
|
||||
if (egid != (gid_t) -1) {
|
||||
if (egid != current->egid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->egid = egid;
|
||||
@@ -1350,7 +1350,7 @@ asmlinkage long sys_setfsuid(uid_t uid)
|
||||
uid == current->suid || uid == current->fsuid ||
|
||||
capable(CAP_SETUID)) {
|
||||
if (uid != old_fsuid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->fsuid = uid;
|
||||
@@ -1379,7 +1379,7 @@ asmlinkage long sys_setfsgid(gid_t gid)
|
||||
gid == current->sgid || gid == current->fsgid ||
|
||||
capable(CAP_SETGID)) {
|
||||
if (gid != old_fsgid) {
|
||||
current->mm->dumpable = suid_dumpable;
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
smp_wmb();
|
||||
}
|
||||
current->fsgid = gid;
|
||||
@@ -2176,14 +2176,14 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
error = put_user(current->pdeath_signal, (int __user *)arg2);
|
||||
break;
|
||||
case PR_GET_DUMPABLE:
|
||||
error = current->mm->dumpable;
|
||||
error = get_dumpable(current->mm);
|
||||
break;
|
||||
case PR_SET_DUMPABLE:
|
||||
if (arg2 < 0 || arg2 > 1) {
|
||||
error = -EINVAL;
|
||||
break;
|
||||
}
|
||||
current->mm->dumpable = arg2;
|
||||
set_dumpable(current->mm, arg2);
|
||||
break;
|
||||
|
||||
case PR_SET_UNALIGN:
|
||||
|
Reference in New Issue
Block a user