diff options
Diffstat (limited to 'xenolinux-2.4.22-sparse/fs/exec.c')
-rw-r--r-- | xenolinux-2.4.22-sparse/fs/exec.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/xenolinux-2.4.22-sparse/fs/exec.c b/xenolinux-2.4.22-sparse/fs/exec.c index 2201b473d3..4f512cbb24 100644 --- a/xenolinux-2.4.22-sparse/fs/exec.c +++ b/xenolinux-2.4.22-sparse/fs/exec.c @@ -50,6 +50,7 @@ int core_uses_pid; char core_pattern[65] = "core"; +int core_setuid_ok = 0; /* The maximal length of core_pattern is also specified in sysctl.c */ static struct linux_binfmt *formats; @@ -426,11 +427,6 @@ static int exec_mmap(void) struct mm_struct * mm, * old_mm; old_mm = current->mm; - if (old_mm && atomic_read(&old_mm->mm_users) == 1) { - mm_release(); - exit_mmap(old_mm); - return 0; - } mm = mm_alloc(); if (mm) { @@ -1105,13 +1101,18 @@ int do_coredump(long signr, struct pt_regs * regs) struct file * file; struct inode * inode; int retval = 0; + int fsuid = current->fsuid; lock_kernel(); binfmt = current->binfmt; if (!binfmt || !binfmt->core_dump) goto fail; if (!is_dumpable(current)) - goto fail; + { + if(!core_setuid_ok || !current->task_dumpable) + goto fail; + current->fsuid = 0; + } current->mm->dumpable = 0; if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump) goto fail; @@ -1140,6 +1141,8 @@ int do_coredump(long signr, struct pt_regs * regs) close_fail: filp_close(file, NULL); fail: + if (fsuid != current->fsuid) + current->fsuid = fsuid; unlock_kernel(); return retval; } |