diff options
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r-- | sys/kern/kern_sig.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 694d145..3b213a6 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -3058,8 +3058,19 @@ coredump(struct thread *td) MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); _STOPEVENT(p, S_CORE, 0); + name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); + if (name == NULL) { +#ifdef AUDIT + audit_proc_coredump(td, NULL, EINVAL); +#endif + return (EINVAL); + } if (((sugid_coredump == 0) && p->p_flag & P_SUGID) || do_coredump == 0) { PROC_UNLOCK(p); +#ifdef AUDIT + audit_proc_coredump(td, name, EFAULT); +#endif + free(name, M_TEMP); return (EFAULT); } @@ -3073,19 +3084,25 @@ coredump(struct thread *td) */ limit = (off_t)lim_cur(p, RLIMIT_CORE); PROC_UNLOCK(p); - if (limit == 0) + if (limit == 0) { +#ifdef AUDIT + audit_proc_coredump(td, name, EFBIG); +#endif + free(name, M_TEMP); return (EFBIG); + } restart: - name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); - if (name == NULL) - return (EINVAL); NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, name, td); flags = O_CREAT | FWRITE | O_NOFOLLOW; error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, NULL); - free(name, M_TEMP); - if (error) + if (error) { +#ifdef AUDIT + audit_proc_coredump(td, name, error); +#endif + free(name, M_TEMP); return (error); + } vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; @@ -3143,6 +3160,10 @@ close: if (error == 0) error = error1; out: +#ifdef AUDIT + audit_proc_coredump(td, name, error); +#endif + free(name, M_TEMP); VFS_UNLOCK_GIANT(vfslocked); return (error); } |