aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.22-sparse/fs/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'xenolinux-2.4.22-sparse/fs/exec.c')
-rw-r--r--xenolinux-2.4.22-sparse/fs/exec.c15
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;
}