diff options
author | Matt Macy <mmacy@FreeBSD.org> | 2018-06-11 16:31:42 +0000 |
---|---|---|
committer | Matt Macy <mmacy@FreeBSD.org> | 2018-06-11 16:31:42 +0000 |
commit | c34bf300692e3f57d7099c81c6076761b0a138b4 (patch) | |
tree | a6a7e87f31e015f8f9fc8ad4c3d862c261ea9be0 /sys/kern/uipc_socket.c | |
parent | a9336cef393c402f11b7119f0a8b1de61ee2cc3d (diff) | |
download | src-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.c | 7 |
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) |