diff options
author | julian <julian@FreeBSD.org> | 1999-09-01 00:29:56 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1999-09-01 00:29:56 +0000 |
commit | 777a32c86509533074c7be935c4c055b2067f28b (patch) | |
tree | 11e2d7c456bbdbd477715a2e2bc4aec73bfec435 /sys/kern/imgact_elf.c | |
parent | 938ff8b8dc85de738517655e95e7e31f276c899f (diff) | |
download | FreeBSD-src-777a32c86509533074c7be935c4c055b2067f28b.zip FreeBSD-src-777a32c86509533074c7be935c4c055b2067f28b.tar.gz |
General cleanup of core-dumping code.
Submitted by: Sean Fagan,
Diffstat (limited to 'sys/kern/imgact_elf.c')
-rw-r--r-- | sys/kern/imgact_elf.c | 52 |
1 files changed, 8 insertions, 44 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index d58d274..e31d90b 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -683,24 +683,17 @@ static void elf_putnote __P((void *, size_t *, const char *, int, extern int osreldate; int -elf_coredump(p) +elf_coredump(p, vp, limit) register struct proc *p; -{ register struct vnode *vp; + off_t limit; +{ register struct ucred *cred = p->p_cred->pc_ucred; - struct nameidata nd; - struct vattr vattr; - int error, error1; - char *name; /* name of corefile */ + int error = 0; struct sseg_closure seginfo; void *hdr; size_t hdrsize; - STOPEVENT(p, S_CORE, 0); - - if (sugid_coredump == 0 && p->p_flag & P_SUGID) - return (EFAULT); - /* Size the program segments. */ seginfo.count = 0; seginfo.size = 0; @@ -716,31 +709,8 @@ elf_coredump(p) (const prstatus_t *)NULL, (const prfpregset_t *)NULL, (const prpsinfo_t *)NULL, seginfo.count); - if (hdrsize + seginfo.size >= p->p_rlimit[RLIMIT_CORE].rlim_cur) + if (hdrsize + seginfo.size >= limit) return (EFAULT); - name = expand_name(p->p_comm, p->p_ucred->cr_uid, p->p_pid); - if (name == NULL) - return (EFAULT); /* XXX -- not the best error */ - - NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, p); - error = vn_open(&nd, O_CREAT | FWRITE | O_NOFOLLOW, S_IRUSR | S_IWUSR); - free(name, M_TEMP); - if (error) - return (error); - vp = nd.ni_vp; - - /* Don't dump to non-regular files or files with links. */ - if (vp->v_type != VREG || - VOP_GETATTR(vp, &vattr, cred, p) || vattr.va_nlink != 1) { - error = EFAULT; - goto out; - } - VATTR_NULL(&vattr); - vattr.va_size = 0; - VOP_LEASE(vp, p, cred, LEASE_WRITE); - VOP_SETATTR(vp, &vattr, cred, p); - p->p_acflag |= ACORE; - /* * Allocate memory for building the header, fill it up, @@ -748,8 +718,7 @@ elf_coredump(p) */ hdr = malloc(hdrsize, M_TEMP, M_WAITOK); if (hdr == NULL) { - error = EINVAL; - goto out; + return EINVAL; } error = elf_corehdr(p, vp, cred, seginfo.count, hdr, hdrsize); @@ -772,13 +741,8 @@ elf_coredump(p) } } free(hdr, M_TEMP); - -out: - VOP_UNLOCK(vp, 0, p); - error1 = vn_close(vp, FWRITE, cred, p); - if (error == 0) - error = error1; - return (error); + + return error; } /* |