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.237 retrieving revision 1.243 diff -u -p -r1.237 -r1.243 --- src/sys/kern/uipc_socket.c 2015/04/05 02:26:39 1.237 +++ src/sys/kern/uipc_socket.c 2015/05/02 23:46:04 1.243 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.237 2015/04/05 02:26:39 rtr Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.243 2015/05/02 23:46:04 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.237 2015/04/05 02:26:39 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.243 2015/05/02 23:46:04 rtr Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -631,7 +631,7 @@ sobind(struct socket *so, struct sockadd solock(so); if (nam->sa_family != so->so_proto->pr_domain->dom_family) { sounlock(so); - return EINVAL; + return EAFNOSUPPORT; } error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l); sounlock(so); @@ -793,7 +793,7 @@ soabort(struct socket *so) } int -soaccept(struct socket *so, struct mbuf *nam) +soaccept(struct socket *so, struct sockaddr *nam) { int error; @@ -811,7 +811,7 @@ soaccept(struct socket *so, struct mbuf } int -soconnect(struct socket *so, struct mbuf *nam, struct lwp *l) +soconnect(struct socket *so, struct sockaddr *nam, struct lwp *l) { int error; @@ -827,10 +827,14 @@ soconnect(struct socket *so, struct mbuf */ if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && ((so->so_proto->pr_flags & PR_CONNREQUIRED) || - (error = sodisconnect(so)))) + (error = sodisconnect(so)))) { error = EISCONN; - else + } else { + if (nam->sa_family != so->so_proto->pr_domain->dom_family) { + return EAFNOSUPPORT; + } error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l); + } return error; } @@ -937,7 +941,7 @@ sosend(struct socket *so, struct mbuf *a error = ENOTCONN; goto release; } - } else if (addr == 0) { + } else if (NULL == addr) { error = EDESTADDRREQ; goto release; } @@ -1051,12 +1055,17 @@ sosend(struct socket *so, struct mbuf *a so->so_options |= SO_DONTROUTE; if (resid > 0) so->so_state |= SS_MORETOCOME; - if (flags & MSG_OOB) + if (flags & MSG_OOB) { error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so, top, control); - else + } else { + struct sockaddr *sin = NULL; + if (addr) { + sin = mtod(addr, struct sockaddr *); + } error = (*so->so_proto->pr_usrreqs->pr_send)(so, - top, addr, control, l); + top, sin, control, l); + } if (dontroute) so->so_options &= ~SO_DONTROUTE; if (resid > 0)