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 retrieving revision 1.122.4.3 retrieving revision 1.123 diff -u -p -r1.122.4.3 -r1.123 --- src/sys/kern/uipc_socket.c 2007/02/01 08:48:39 1.122.4.3 +++ src/sys/kern/uipc_socket.c 2006/10/02 00:02:04 1.123 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.122.4.3 2007/02/01 08:48:39 ad Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.123 2006/10/02 00:02:04 elad Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.122.4.3 2007/02/01 08:48:39 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.123 2006/10/02 00:02:04 elad Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -473,12 +473,6 @@ socreate(int dom, struct socket **aso, i uid_t uid; int error, s; - error = kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET, - KAUTH_REQ_NETWORK_SOCKET_OPEN, KAUTH_ARG(dom), KAUTH_ARG(type), - KAUTH_ARG(proto)); - if (error) - return (error); - if (proto) prp = pffindproto(dom, proto, type); else @@ -512,8 +506,11 @@ socreate(int dom, struct socket **aso, i #endif if (l != NULL) { uid = kauth_cred_geteuid(l->l_cred); + kauth_cred_hold(l->l_cred); + so->so_cred = l->l_cred; } else { uid = 0; + so->so_cred = NULL; } so->so_uidinfo = uid_find(uid); error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, @@ -733,6 +730,8 @@ sodisconnect(struct socket *so) error = EALREADY; goto bad; } + if (so->so_cred != NULL) + kauth_cred_free(so->so_cred); error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0, (struct lwp *)0); @@ -1423,7 +1422,6 @@ sosetopt(struct socket *so, int level, i { int error; struct mbuf *m; - struct linger *l; error = 0; m = m0; @@ -1440,18 +1438,13 @@ sosetopt(struct socket *so, int level, i error = EINVAL; goto bad; } - l = mtod(m, struct linger *); - if (l->l_linger < 0 || l->l_linger > USHRT_MAX || - l->l_linger > (INT_MAX / hz)) { + if (mtod(m, struct linger *)->l_linger < 0 || + mtod(m, struct linger *)->l_linger > (INT_MAX / hz)) { error = EDOM; goto bad; } - so->so_linger = l->l_linger; - if (l->l_onoff) - so->so_options |= SO_LINGER; - else - so->so_options &= ~SO_LINGER; - break; + so->so_linger = mtod(m, struct linger *)->l_linger; + /* fall thru... */ case SO_DEBUG: case SO_KEEPALIVE: @@ -1591,7 +1584,7 @@ sogetopt(struct socket *so, int level, i case SO_LINGER: m->m_len = sizeof(struct linger); mtod(m, struct linger *)->l_onoff = - (so->so_options & SO_LINGER) ? 1 : 0; + so->so_options & SO_LINGER; mtod(m, struct linger *)->l_linger = so->so_linger; break; @@ -1604,7 +1597,7 @@ sogetopt(struct socket *so, int level, i case SO_BROADCAST: case SO_OOBINLINE: case SO_TIMESTAMP: - *mtod(m, int *) = (so->so_options & optname) ? 1 : 0; + *mtod(m, int *) = so->so_options & optname; break; case SO_TYPE: