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.
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to