svn commit: r248172 - head/sys/kern

Michael Tuexen tuexen at fh-muenster.de
Mon Mar 11 17:47:56 UTC 2013


On Mar 11, 2013, at 1:43 PM, Michael Tuexen wrote:

> Author: tuexen
> Date: Mon Mar 11 17:43:55 2013
> New Revision: 248172
> URL: http://svnweb.freebsd.org/changeset/base/248172
> 
> Log:
>  Return an error if sctp_peeloff() fails because a socket can't be allocated.
Hmm. Just wanted to commit the change to uipc_syscalls.c and do the
other fix separately. So the missing commit message is:
sctp_peeloff() uses sonewconn() also in cases where listen() wasn't called.
So honor this use case.
> 
>  MFC after: 3 days
> 
> Modified:
>  head/sys/kern/uipc_socket.c
>  head/sys/kern/uipc_syscalls.c
> 
> Modified: head/sys/kern/uipc_socket.c
> ==============================================================================
> --- head/sys/kern/uipc_socket.c	Mon Mar 11 17:36:37 2013	(r248171)
> +++ head/sys/kern/uipc_socket.c	Mon Mar 11 17:43:55 2013	(r248172)
> @@ -136,6 +136,7 @@ __FBSDID("$FreeBSD$");
> #include <sys/uio.h>
> #include <sys/jail.h>
> #include <sys/syslog.h>
> +#include <netinet/in.h>
> 
> #include <net/vnet.h>
> 
> @@ -565,8 +566,12 @@ sonewconn(struct socket *head, int conns
> 	/*
> 	 * The accept socket may be tearing down but we just
> 	 * won a race on the ACCEPT_LOCK.
> +	 * However, if sctp_peeloff() is called on a 1-to-many
> +	 * style socket, the SO_ACCEPTCONN doesn't need to be set.
> 	 */
> -	if (!(head->so_options & SO_ACCEPTCONN)) {
> +	if (!(head->so_options & SO_ACCEPTCONN) &&
> +	    ((head->so_proto->pr_protocol != IPPROTO_SCTP) ||
> +	     (head->so_type != SOCK_SEQPACKET))) {
> 		SOCK_LOCK(so);
> 		so->so_head = NULL;
> 		sofree(so);		/* NB: returns ACCEPT_UNLOCK'ed. */
> 
> Modified: head/sys/kern/uipc_syscalls.c
> ==============================================================================
> --- head/sys/kern/uipc_syscalls.c	Mon Mar 11 17:36:37 2013	(r248171)
> +++ head/sys/kern/uipc_syscalls.c	Mon Mar 11 17:43:55 2013	(r248172)
> @@ -2386,8 +2386,10 @@ sys_sctp_peeloff(td, uap)
> 
> 	CURVNET_SET(head->so_vnet);
> 	so = sonewconn(head, SS_ISCONNECTED);
> -	if (so == NULL)
> +	if (so == NULL) {
> +		error = ENOMEM;
> 		goto noconnection;
> +	}
> 	/*
> 	 * Before changing the flags on the socket, we have to bump the
> 	 * reference count.  Otherwise, if the protocol calls sofree(),
> 



More information about the svn-src-all mailing list