summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_descrip.c6
-rw-r--r--sys/kern/kern_fork.c3
-rw-r--r--sys/kern/kern_prot.c51
-rw-r--r--sys/kern/uipc_sockbuf.c6
-rw-r--r--sys/kern/uipc_socket.c3
-rw-r--r--sys/kern/uipc_socket2.c6
-rw-r--r--sys/kern/vfs_bio.c14
-rw-r--r--sys/kern/vfs_cluster.c6
8 files changed, 47 insertions, 48 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index d28a798..b0f9e08 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -588,8 +588,7 @@ fsetown(pgid, sigiop)
sigio->sio_pgrp = pgrp;
}
sigio->sio_pgid = pgid;
- crhold(curthread->td_proc->p_ucred);
- sigio->sio_ucred = curthread->td_proc->p_ucred;
+ sigio->sio_ucred = crhold(curthread->td_proc->p_ucred);
sigio->sio_myref = sigiop;
s = splhigh();
*sigiop = sigio;
@@ -995,10 +994,9 @@ falloc(td, resultfp, resultfd)
return (error);
}
fp->f_count = 1;
- fp->f_cred = p->p_ucred;
+ fp->f_cred = crhold(p->p_ucred);
fp->f_ops = &badfileops;
fp->f_seqcount = 1;
- crhold(fp->f_cred);
if ((fq = p->p_fd->fd_ofiles[0])) {
LIST_INSERT_AFTER(fq, fp, f_list);
} else {
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index f5ae42c..592ff44 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -471,8 +471,7 @@ again:
* We start off holding one spinlock after fork: sched_lock.
*/
PROC_LOCK(p1);
- crhold(p1->p_ucred);
- p2->p_ucred = p1->p_ucred;
+ p2->p_ucred = crhold(p1->p_ucred);
if (p2->p_args)
p2->p_args->ar_ref++;
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 7faf612..553b278 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -1586,14 +1586,15 @@ crget()
/*
* Claim another reference to a ucred structure.
*/
-void
+struct ucred *
crhold(cr)
struct ucred *cr;
{
mtx_lock(&cr->cr_mtx);
cr->cr_ref++;
- mtx_unlock(&(cr)->cr_mtx);
+ mtx_unlock(&cr->cr_mtx);
+ return (cr);
}
@@ -1631,23 +1632,36 @@ crfree(cr)
}
/*
- * Copy cred structure to a new one and free the old one.
+ * Check to see if this ucred is shared.
*/
-struct ucred *
-crcopy(cr)
+int
+crshared(cr)
struct ucred *cr;
{
- struct ucred *newcr;
+ int shared;
mtx_lock(&cr->cr_mtx);
- if (cr->cr_ref == 1) {
- mtx_unlock(&cr->cr_mtx);
- return (cr);
- }
+ shared = (cr->cr_ref > 1);
mtx_unlock(&cr->cr_mtx);
- newcr = crdup(cr);
- crfree(cr);
- return (newcr);
+ return (shared);
+}
+
+/*
+ * Copy a ucred's contents from a template. Does not block.
+ */
+void
+crcopy(dest, src)
+ struct ucred *dest, *src;
+{
+
+ KASSERT(crshared(dest) == 0, ("crcopy of shared ucred"));
+ bcopy(&src->cr_startcopy, &dest->cr_startcopy,
+ (unsigned)((caddr_t)&src->cr_endcopy -
+ (caddr_t)&src->cr_startcopy));
+ uihold(dest->cr_uidinfo);
+ uihold(dest->cr_ruidinfo);
+ if (jailed(dest))
+ prison_hold(dest->cr_prison);
}
/*
@@ -1659,15 +1673,8 @@ crdup(cr)
{
struct ucred *newcr;
- MALLOC(newcr, struct ucred *, sizeof(*cr), M_CRED, M_WAITOK);
- *newcr = *cr;
- bzero(&newcr->cr_mtx, sizeof(newcr->cr_mtx));
- mtx_init(&newcr->cr_mtx, "ucred", MTX_DEF);
- uihold(newcr->cr_uidinfo);
- uihold(newcr->cr_ruidinfo);
- if (jailed(newcr))
- prison_hold(newcr->cr_prison);
- newcr->cr_ref = 1;
+ newcr = crget();
+ crcopy(newcr, cr);
return (newcr);
}
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c
index b0c23fd..c969e7d 100644
--- a/sys/kern/uipc_sockbuf.c
+++ b/sys/kern/uipc_sockbuf.c
@@ -240,8 +240,10 @@ sonewconn3(head, connstatus, td)
so->so_state = head->so_state | SS_NOFDREF;
so->so_proto = head->so_proto;
so->so_timeo = head->so_timeo;
- so->so_cred = td ? td->td_proc->p_ucred : head->so_cred;
- crhold(so->so_cred);
+ if (td != NULL)
+ so->so_cred = crhold(td->td_proc->p_ucred);
+ else
+ so->so_cred = crhold(head->so_cred);
if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat) ||
(*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
sodealloc(so);
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 65ef837..a7ac484 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -160,8 +160,7 @@ socreate(dom, aso, type, proto, td)
TAILQ_INIT(&so->so_incomp);
TAILQ_INIT(&so->so_comp);
so->so_type = type;
- so->so_cred = td->td_proc->p_ucred;
- crhold(so->so_cred);
+ so->so_cred = crhold(td->td_proc->p_ucred);
so->so_proto = prp;
error = (*prp->pr_usrreqs->pru_attach)(so, proto, td);
if (error) {
diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c
index b0c23fd..c969e7d 100644
--- a/sys/kern/uipc_socket2.c
+++ b/sys/kern/uipc_socket2.c
@@ -240,8 +240,10 @@ sonewconn3(head, connstatus, td)
so->so_state = head->so_state | SS_NOFDREF;
so->so_proto = head->so_proto;
so->so_timeo = head->so_timeo;
- so->so_cred = td ? td->td_proc->p_ucred : head->so_cred;
- crhold(so->so_cred);
+ if (td != NULL)
+ so->so_cred = crhold(td->td_proc->p_ucred);
+ else
+ so->so_cred = crhold(head->so_cred);
if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat) ||
(*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
sodealloc(so);
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index f2a78bd..510222c 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -599,11 +599,8 @@ breadn(struct vnode * vp, daddr_t blkno, int size,
bp->b_iocmd = BIO_READ;
bp->b_flags &= ~B_INVAL;
bp->b_ioflags &= ~BIO_ERROR;
- if (bp->b_rcred == NOCRED) {
- if (cred != NOCRED)
- crhold(cred);
- bp->b_rcred = cred;
- }
+ if (bp->b_rcred == NOCRED && cred != NOCRED)
+ bp->b_rcred = crhold(cred);
vfs_busy_pages(bp, 0);
VOP_STRATEGY(vp, bp);
++readwait;
@@ -621,11 +618,8 @@ breadn(struct vnode * vp, daddr_t blkno, int size,
rabp->b_flags &= ~B_INVAL;
rabp->b_ioflags &= ~BIO_ERROR;
rabp->b_iocmd = BIO_READ;
- if (rabp->b_rcred == NOCRED) {
- if (cred != NOCRED)
- crhold(cred);
- rabp->b_rcred = cred;
- }
+ if (rabp->b_rcred == NOCRED && cred != NOCRED)
+ rabp->b_rcred = crhold(cred);
vfs_busy_pages(rabp, 0);
BUF_KERNPROC(rabp);
VOP_STRATEGY(vp, rabp);
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c
index b685740..1960c28 100644
--- a/sys/kern/vfs_cluster.c
+++ b/sys/kern/vfs_cluster.c
@@ -774,10 +774,8 @@ cluster_wbuild(vp, size, start_lbn, len)
bp->b_op = tbp->b_op;
bp->b_bufsize = 0;
bp->b_npages = 0;
- if (tbp->b_wcred != NOCRED) {
- bp->b_wcred = tbp->b_wcred;
- crhold(bp->b_wcred);
- }
+ if (tbp->b_wcred != NOCRED)
+ bp->b_wcred = crhold(tbp->b_wcred);
bp->b_blkno = tbp->b_blkno;
bp->b_lblkno = tbp->b_lblkno;
OpenPOWER on IntegriCloud