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.129.2.1 retrieving revision 1.130 diff -u -p -r1.129.2.1 -r1.130 --- src/sys/kern/uipc_socket.c 2007/05/13 21:23:47 1.129.2.1 +++ src/sys/kern/uipc_socket.c 2006/12/06 20:49:02 1.130 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.129.2.1 2007/05/13 21:23:47 pavel Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.130 2006/12/06 20:49:02 christos Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.129.2.1 2007/05/13 21:23:47 pavel Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.130 2006/12/06 20:49:02 christos Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -654,15 +654,9 @@ soclose(struct socket *so) int soabort(struct socket *so) { - int error; - KASSERT(so->so_head == NULL); - error = (*so->so_proto->pr_usrreq)(so, PRU_ABORT, (struct mbuf *)0, + return (*so->so_proto->pr_usrreq)(so, PRU_ABORT, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0, (struct lwp *)0); - if (error) { - sofree(so); - } - return error; } int @@ -1428,6 +1422,7 @@ sosetopt(struct socket *so, int level, i { int error; struct mbuf *m; + struct linger *l; error = 0; m = m0; @@ -1444,13 +1439,17 @@ sosetopt(struct socket *so, int level, i error = EINVAL; goto bad; } - if (mtod(m, struct linger *)->l_linger < 0 || - mtod(m, struct linger *)->l_linger > (INT_MAX / hz)) { + l = mtod(m, struct linger *); + if (l->l_linger < 0 || l->l_linger > (INT_MAX / hz)) { error = EDOM; goto bad; } - so->so_linger = mtod(m, struct linger *)->l_linger; - /* fall thru... */ + so->so_linger = l->l_linger; + if (l->l_onoff) + so->so_options |= SO_LINGER; + else + so->so_options &= ~SO_LINGER; + break; case SO_DEBUG: case SO_KEEPALIVE: