aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2018-06-11 16:31:42 +0000
committerMatt Macy <mmacy@FreeBSD.org>2018-06-11 16:31:42 +0000
commitc34bf300692e3f57d7099c81c6076761b0a138b4 (patch)
treea6a7e87f31e015f8f9fc8ad4c3d862c261ea9be0 /sys/kern/uipc_socket.c
parenta9336cef393c402f11b7119f0a8b1de61ee2cc3d (diff)
downloadsrc-c34bf300692e3f57d7099c81c6076761b0a138b4.tar.gz
src-c34bf300692e3f57d7099c81c6076761b0a138b4.zip
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
Notes
Notes: svn path=/head/; revision=334960
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index cc3013ec3252..60900c6f12a1 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -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 **psa, struct uio *uio,
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)