diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_descrip.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_prot.c | 51 | ||||
-rw-r--r-- | sys/kern/uipc_sockbuf.c | 6 | ||||
-rw-r--r-- | sys/kern/uipc_socket.c | 3 | ||||
-rw-r--r-- | sys/kern/uipc_socket2.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_bio.c | 14 | ||||
-rw-r--r-- | sys/kern/vfs_cluster.c | 6 |
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; |