aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-09-12 20:05:49 +0000
committerMark Johnston <markj@FreeBSD.org>2021-09-12 20:39:44 +0000
commitb864b67a0d197f59ecf6698940600956ceee2cae (patch)
tree01db2de212f6f7991577b52a4d7ae2d14c61eb7b
parente31cc1d526dcdfcbe5666deb8b11decc5126a871 (diff)
downloadsrc-b864b67a0d197f59ecf6698940600956ceee2cae.tar.gz
src-b864b67a0d197f59ecf6698940600956ceee2cae.zip
socket: Do not include control messages in FIONREAD return value
Some system software expects to be able to read at least the number of bytes returned by FIONREAD. When control messages are counted in this return value, this assumption is violated. Follow Linux and OpenBSD here (as well as our own kevent(EVFILT_READ)) and only return the number of data bytes available. Reported by: avg MFC after: 2 weeks
-rw-r--r--sys/kern/sys_socket.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index 83dc1cb2622b..8cf703ab8ebd 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -206,12 +206,13 @@ soo_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred,
break;
case FIONREAD:
- /* Unlocked read. */
+ SOCK_RECVBUF_LOCK(so);
if (SOLISTENING(so)) {
error = EINVAL;
} else {
- *(int *)data = sbavail(&so->so_rcv);
+ *(int *)data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
}
+ SOCK_RECVBUF_UNLOCK(so);
break;
case FIONWRITE: