Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Jun 2018 16:31:43 +0000 (UTC)
From:      Matt Macy <mmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r334960 - head/sys/kern
Message-ID:  <201806111631.w5BGVh2M051386@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 	if (flags & MSG_OOB)
 		return (soreceive_rcvoob(so, uio, flags));
 	if (mp0 != NULL)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201806111631.w5BGVh2M051386>