diff -uNr pre6-6patched/fs/binfmt_elf.c c6/fs/binfmt_elf.c --- pre6-6patched/fs/binfmt_elf.c Tue Apr 25 13:43:05 2000 +++ c6/fs/binfmt_elf.c Wed Apr 26 19:21:20 2000 @@ -991,6 +991,7 @@ struct elf_prstatus prstatus; /* NT_PRSTATUS */ elf_fpregset_t fpu; /* NT_PRFPREG */ struct elf_prpsinfo psinfo; /* NT_PRPSINFO */ + sigset_t save_set; segs = current->mm->map_count; @@ -998,6 +999,10 @@ printk("elf_core_dump: %d segs %lu limit\n", segs, limit); #endif + spin_lock_irq(¤t->sigmask_lock); + save_set = current->blocked; + spin_unlock_irq(¤t->sigmask_lock); + /* Set up header */ memcpy(elf.e_ident, ELFMAG, SELFMAG); elf.e_ident[EI_CLASS] = ELF_CLASS; @@ -1181,6 +1186,12 @@ DUMP_SEEK(dataoff); + /* Only allow SIGKILL */ + spin_lock_irq(¤t->sigmask_lock); + sigfillset(¤t->blocked); + sigdelsetmask(¤t->blocked, sigmask(SIGKILL)); + spin_unlock_irq(¤t->sigmask_lock); + for(vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) { unsigned long addr; @@ -1208,6 +1219,8 @@ pte_none(*pte)) { DUMP_SEEK (file->f_pos + PAGE_SIZE); } else { + if (signal_pending(current)) + goto end_coredump; DUMP_WRITE((void*)addr, PAGE_SIZE); } } @@ -1220,6 +1233,9 @@ } end_coredump: + spin_lock_irq(¤t->sigmask_lock); + current->blocked = save_set; + spin_unlock_irq(¤t->sigmask_lock); set_fs(fs); return has_dumped; }