disclaimer: I didn't write this. Dean diff -ruN pre-2.0.32-1/fs/binfmt_elf.c linux/fs/binfmt_elf.c --- pre-2.0.32-1/fs/binfmt_elf.c Wed Oct 15 23:56:43 1997 +++ linux/fs/binfmt_elf.c Wed Nov 12 00:56:19 1997 @@ -979,7 +979,7 @@ struct file file; struct inode *inode; unsigned short fs; - char corefile[6+sizeof(current->comm)]; + char corefile[12+5+sizeof(current->comm)]; int segs; int i; size_t size; @@ -993,8 +993,26 @@ elf_fpregset_t fpu; /* NT_PRFPREG */ struct elf_prpsinfo psinfo; /* NT_PRPSINFO */ - if (!current->dumpable || limit < PAGE_SIZE || current->mm->count != 1) + if (cdmp_options & CDMP_OPT_VARCORE) { + sprintf(corefile, "/var/core/%s.%d", current->comm, current->pid); + } else { + memcpy(corefile,"core.",5); +#if 0 + memcpy(corefile+5,current->comm,sizeof(current->comm)); +#else + corefile[4] = '\0'; +#endif + } + if (cdmp_options & CDMP_OPT_LOG) + printk(KERN_INFO "%s: Dumping core in %s\n",current->comm, corefile); + if (!current->dumpable || limit < PAGE_SIZE || current->mm->count != 1) { + if (cdmp_options & CDMP_OPT_LOG) + printk(KERN_INFO "%s: No coredump, %s%s%s\n", current->comm, + ! current->dumpable ? "Not dumpable" : "", + limit < PAGE_SIZE ? "RLIMIT_CORE setting" : "", + current->mm->count != 1 ? "mm->count != 1" : ""); return 0; + } current->dumpable = 0; #ifndef CONFIG_BINFMT_ELF @@ -1044,13 +1062,11 @@ fs = get_fs(); set_fs(KERNEL_DS); - memcpy(corefile,"core.",5); -#if 0 - memcpy(corefile+5,current->comm,sizeof(current->comm)); -#else - corefile[4] = '\0'; -#endif + if (open_namei(corefile,O_CREAT | 2 | O_TRUNC,0600,&inode,NULL)) { + if (cdmp_options & CDMP_OPT_LOG) + printk(KERN_INFO "%s: Could not create %s\n", current->comm, + corefile); inode = NULL; goto end_coredump; } diff -ruN pre-2.0.32-1/fs/exec.c linux/fs/exec.c --- pre-2.0.32-1/fs/exec.c Mon Nov 10 17:04:45 1997 +++ linux/fs/exec.c Wed Nov 12 00:56:19 1997 @@ -483,8 +483,8 @@ flush_thread(); - if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || - permission(bprm->inode,MAY_READ)) + if (((bprm->e_uid != current->euid || bprm->e_gid != current->egid) && + (cdmp_options & CDMP_OPT_INISETUID) == 0) || permission(bprm->inode,MAY_READ)) current->dumpable = 0; flush_old_signals(current->sig); diff -ruN pre-2.0.32-1/include/linux/sched.h linux/include/linux/sched.h --- pre-2.0.32-1/include/linux/sched.h Thu Oct 16 00:22:05 1997 +++ linux/include/linux/sched.h Wed Nov 12 00:56:19 1997 @@ -332,7 +332,12 @@ extern unsigned long prof_len; extern unsigned long prof_shift; -extern int securelevel; /* system security level */ +extern int securelevel; /* system security level */ +extern int cdmp_options; /* coredump options*/ +#define CDMP_OPT_LOG 1 /* log coredumps KERN_INFO */ +#define CDMP_OPT_INISETUID 2 /* allow setuid programs */ +#define CDMP_OPT_CHGSETUID 4 /* allow programs that change uid/gid */ +#define CDMP_OPT_VARCORE 8 /* dump core in /var/core */ #define CURRENT_TIME (xtime.tv_sec) diff -ruN pre-2.0.32-1/include/linux/sysctl.h linux/include/linux/sysctl.h --- pre-2.0.32-1/include/linux/sysctl.h Tue Aug 12 23:06:35 1997 +++ linux/include/linux/sysctl.h Wed Nov 12 00:56:19 1997 @@ -61,6 +61,7 @@ #define KERN_NFSRADDRS 18 /* NFS root addresses */ #define KERN_JAVA_INTERPRETER 19 /* path to Java(tm) interpreter */ #define KERN_JAVA_APPLETVIEWER 20 /* path to Java(tm) appletviewer */ +#define KERN_COREDUMP_OPT 21 /* several ways to facilitate coredumps */ /* CTL_VM names: */ #define VM_SWAPCTL 1 /* struct: Set vm swapping control */ diff -ruN pre-2.0.32-1/init/main.c linux/init/main.c --- pre-2.0.32-1/init/main.c Thu Aug 14 19:30:08 1997 +++ linux/init/main.c Wed Nov 12 00:56:19 1997 @@ -671,6 +671,12 @@ execute_command = line; continue; } + if (!strncmp(line,"init-rlimit-core=",17)) { + line += 17; + init_task.rlim[RLIMIT_CORE].rlim_cur = simple_strtoul(line, NULL, 10); + continue; + } + if (checksetup(line)) continue; /* diff -ruN pre-2.0.32-1/init/patches/coredump.pinfo linux/init/patches/coredump.pinfo --- pre-2.0.32-1/init/patches/coredump.pinfo Thu Jan 1 01:00:00 1970 +++ linux/init/patches/coredump.pinfo Wed Nov 12 00:56:20 1997 @@ -0,0 +1 @@ +Coredump-ability of daemons, cronjobs, setuid-prgs etc. (Han Holl ) diff -ruN pre-2.0.32-1/kernel/sched.c linux/kernel/sched.c --- pre-2.0.32-1/kernel/sched.c Mon Nov 10 17:04:46 1997 +++ linux/kernel/sched.c Wed Nov 12 00:56:20 1997 @@ -47,6 +47,7 @@ */ int securelevel = 0; /* system security level */ +int cdmp_options = 0; /* system security level */ long tick = (1000000 + HZ/2) / HZ; /* timer interrupt period */ volatile struct timeval xtime; /* The current time */ diff -ruN pre-2.0.32-1/kernel/sys.c linux/kernel/sys.c --- pre-2.0.32-1/kernel/sys.c Tue Aug 5 02:15:07 1997 +++ linux/kernel/sys.c Wed Nov 12 00:56:20 1997 @@ -268,7 +268,7 @@ (egid != (gid_t) -1 && egid != old_rgid)) current->sgid = current->egid; current->fsgid = current->egid; - if (current->egid != old_egid) + if (current->egid != old_egid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return 0; } @@ -286,7 +286,7 @@ current->egid = current->fsgid = gid; else return -EPERM; - if (current->egid != old_egid) + if (current->egid != old_egid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return 0; } @@ -477,7 +477,7 @@ (euid != (uid_t) -1 && euid != old_ruid)) current->suid = current->euid; current->fsuid = current->euid; - if (current->euid != old_euid) + if (current->euid != old_euid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return 0; } @@ -503,7 +503,7 @@ current->fsuid = current->euid = uid; else return -EPERM; - if (current->euid != old_euid) + if (current->euid != old_euid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return(0); } @@ -521,7 +521,7 @@ if (uid == current->uid || uid == current->euid || uid == current->suid || uid == current->fsuid || suser()) current->fsuid = uid; - if (current->fsuid != old_fsuid) + if (current->fsuid != old_fsuid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return old_fsuid; } @@ -536,7 +536,7 @@ if (gid == current->gid || gid == current->egid || gid == current->sgid || gid == current->fsgid || suser()) current->fsgid = gid; - if (current->fsgid != old_fsgid) + if (current->fsgid != old_fsgid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0) current->dumpable = 0; return old_fsgid; } diff -ruN pre-2.0.32-1/kernel/sysctl.c linux/kernel/sysctl.c --- pre-2.0.32-1/kernel/sysctl.c Thu Aug 14 00:02:42 1997 +++ linux/kernel/sysctl.c Wed Nov 12 00:56:20 1997 @@ -126,6 +126,8 @@ 0644, NULL, &proc_dointvec}, {KERN_NRFILE, "file-nr", &nr_files, sizeof(int), 0444, NULL, &proc_dointvec}, + {KERN_COREDUMP_OPT, "coredump", &cdmp_options, sizeof(int), + 0644, NULL, &proc_dointvec}, {KERN_MAXFILE, "file-max", &max_files, sizeof(int), 0644, NULL, &proc_dointvec}, {KERN_SECURELVL, "securelevel", &securelevel, sizeof(int),