summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c33
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);
}
OpenPOWER on IntegriCloud