svn commit: r334960 - head/sys/kern

Mark Johnston markj at freebsd.org
Mon Jun 11 16:54:39 UTC 2018


On Mon, Jun 11, 2018 at 04:31:43PM +0000, Matt Macy wrote:
> Author: mmacy
> Date: Mon Jun 11 16:31:42 2018
> New Revision: 334960
> URL: https://svnweb.freebsd.org/changeset/base/334960
> 
> Log:
>   soreceive_stream: correctly handle edge cases
>   
>   - non NULL controlp is not an error, returning EINVAL
>     would cause X forwarding to fail
>   
>   - MSG_PEEK and MSG_WAITALL are fairly exceptional, but we still
>     want to handle them - punt to soreceive_generic
> 
> Modified:
>   head/sys/kern/uipc_socket.c
> 
> Modified: head/sys/kern/uipc_socket.c
> ==============================================================================
> --- head/sys/kern/uipc_socket.c	Mon Jun 11 16:27:09 2018	(r334959)
> +++ head/sys/kern/uipc_socket.c	Mon Jun 11 16:31:42 2018	(r334960)
> @@ -2162,7 +2162,6 @@ release:
>  
>  /*
>   * Optimized version of soreceive() for stream (TCP) sockets.
> - * XXXAO: (MSG_WAITALL | MSG_PEEK) isn't properly handled.
>   */
>  int
>  soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
> @@ -2177,12 +2176,14 @@ soreceive_stream(struct socket *so, struct sockaddr **
>  		return (EINVAL);
>  	if (psa != NULL)
>  		*psa = NULL;
> -	if (controlp != NULL)
> -		return (EINVAL);
>  	if (flagsp != NULL)
>  		flags = *flagsp &~ MSG_EOR;
>  	else
>  		flags = 0;
> +	if (flags & (MSG_PEEK|MSG_WAITALL))
> +		return (soreceive_generic(so, psa, uio, mp0, controlp, flagsp));
> +	if (controlp != NULL)
> +		*controlp = NULL;

Now soreceive_stream() contains dead code to handle MSG_WAITALL, and a
bunch of always-true checks for both flags.

Changes to this code should be reviewed.


More information about the svn-src-head mailing list