Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.111.2.4 retrieving revision 1.127 diff -u -p -r1.111.2.4 -r1.127 --- src/sys/kern/uipc_socket.c 2006/07/07 12:30:51 1.111.2.4 +++ src/sys/kern/uipc_socket.c 2006/10/25 22:49:23 1.127 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.111.2.4 2006/07/07 12:30:51 yamt Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.127 2006/10/25 22:49:23 elad Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.111.2.4 2006/07/07 12:30:51 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.127 2006/10/25 22:49:23 elad Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -151,7 +151,7 @@ static size_t sodopendfree(void); static size_t sodopendfreel(void); static vsize_t -sokvareserve(struct socket *so, vsize_t len) +sokvareserve(struct socket *so __unused, vsize_t len) { int s; int error; @@ -255,23 +255,30 @@ sokvafree(vaddr_t sva, vsize_t len) } static void -sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size, boolean_t mapped) +sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size) { - vaddr_t sva, eva; + vaddr_t va, sva, eva; vsize_t len; - int npgs; - - KASSERT(pgs != NULL); + paddr_t pa; + int i, npgs; eva = round_page((vaddr_t) buf + size); sva = trunc_page((vaddr_t) buf); len = eva - sva; npgs = len >> PAGE_SHIFT; - if (mapped) { - pmap_kremove(sva, len); - pmap_update(pmap_kernel()); + if (__predict_false(pgs == NULL)) { + pgs = alloca(npgs * sizeof(*pgs)); + + for (i = 0, va = sva; va < eva; i++, va += PAGE_SIZE) { + if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) + panic("sodoloanfree: va 0x%lx not mapped", va); + pgs[i] = PHYS_TO_VM_PAGE(pa); + } } + + pmap_kremove(sva, len); + pmap_update(pmap_kernel()); uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE); sokvafree(sva, len); } @@ -319,13 +326,11 @@ sodopendfreel() for (; m != NULL; m = next) { next = m->m_next; - KASSERT((~m->m_flags & (M_EXT|M_EXT_PAGES)) == 0); - KASSERT(m->m_ext.ext_refcnt == 0); rv += m->m_ext.ext_size; - sodoloanfree(m->m_ext.ext_pgs, m->m_ext.ext_buf, - m->m_ext.ext_size, - (m->m_ext.ext_flags & M_EXT_LAZY) == 0); + sodoloanfree((m->m_flags & M_EXT_PAGES) ? + m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf, + m->m_ext.ext_size); pool_cache_put(&mbpool_cache, m); } @@ -337,11 +342,19 @@ sodopendfreel() } void -soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg) +soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg __unused) { int s; - KASSERT(m != NULL); + if (m == NULL) { + + /* + * called from MEXTREMOVE. + */ + + sodoloanfree(NULL, buf, size); + return; + } /* * postpone freeing mbuf. @@ -366,12 +379,8 @@ sosend_loan(struct socket *so, struct ui struct iovec *iov = uio->uio_iov; vaddr_t sva, eva; vsize_t len; - vaddr_t lva; - int npgs, error; -#if !defined(__HAVE_LAZY_MBUF) - vaddr_t va; - int i; -#endif /* !defined(__HAVE_LAZY_MBUF) */ + vaddr_t lva, va; + int npgs, i, error; if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace)) return (0); @@ -400,23 +409,16 @@ sosend_loan(struct socket *so, struct ui return (0); } -#if !defined(__HAVE_LAZY_MBUF) for (i = 0, va = lva; i < npgs; i++, va += PAGE_SIZE) pmap_kenter_pa(va, VM_PAGE_TO_PHYS(m->m_ext.ext_pgs[i]), VM_PROT_READ); pmap_update(pmap_kernel()); -#endif /* !defined(__HAVE_LAZY_MBUF) */ lva += (vaddr_t) iov->iov_base & PAGE_MASK; MEXTADD(m, (caddr_t) lva, space, M_MBUF, soloanfree, so); m->m_flags |= M_EXT_PAGES | M_EXT_ROMAP; -#if defined(__HAVE_LAZY_MBUF) - m->m_flags |= M_EXT_LAZY; - m->m_ext.ext_flags |= M_EXT_LAZY; -#endif /* defined(__HAVE_LAZY_MBUF) */ - uio->uio_resid -= space; /* uio_offset not updated, not set/used for write(2) */ uio->uio_iov->iov_base = (caddr_t) uio->uio_iov->iov_base + space; @@ -430,7 +432,8 @@ sosend_loan(struct socket *so, struct ui } static int -sokva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg) +sokva_reclaim_callback(struct callback_entry *ce __unused, void *obj __unused, + void *arg __unused) { KASSERT(ce == &sokva_reclaimerentry); @@ -471,6 +474,10 @@ socreate(int dom, struct socket **aso, i uid_t uid; int error, s; + if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET, + KAUTH_REQ_NETWORK_SOCKET_OPEN, &dom, &type, &proto) != 0) + return (EPERM); + if (proto) prp = pffindproto(dom, proto, type); else @@ -503,7 +510,7 @@ socreate(int dom, struct socket **aso, i so->so_mowner = &prp->pr_domain->dom_mowner; #endif if (l != NULL) { - uid = kauth_cred_geteuid(l->l_proc->p_cred); + uid = kauth_cred_geteuid(l->l_cred); } else { uid = 0; } @@ -1664,7 +1671,7 @@ filt_sordetach(struct knote *kn) /*ARGSUSED*/ static int -filt_soread(struct knote *kn, long hint) +filt_soread(struct knote *kn, long hint __unused) { struct socket *so; @@ -1695,7 +1702,7 @@ filt_sowdetach(struct knote *kn) /*ARGSUSED*/ static int -filt_sowrite(struct knote *kn, long hint) +filt_sowrite(struct knote *kn, long hint __unused) { struct socket *so; @@ -1718,7 +1725,7 @@ filt_sowrite(struct knote *kn, long hint /*ARGSUSED*/ static int -filt_solisten(struct knote *kn, long hint) +filt_solisten(struct knote *kn, long hint __unused) { struct socket *so; @@ -1740,7 +1747,7 @@ static const struct filterops sowrite_fi { 1, NULL, filt_sowdetach, filt_sowrite }; int -soo_kqfilter(struct file *fp, struct knote *kn) +soo_kqfilter(struct file *fp __unused, struct knote *kn) { struct socket *so; struct sockbuf *sb;