diff options
author | Mark Johnston <markj@FreeBSD.org> | 2021-09-12 20:05:49 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2021-09-12 20:39:44 +0000 |
commit | b864b67a0d197f59ecf6698940600956ceee2cae (patch) | |
tree | 01db2de212f6f7991577b52a4d7ae2d14c61eb7b | |
parent | e31cc1d526dcdfcbe5666deb8b11decc5126a871 (diff) | |
download | src-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.c | 5 |
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: |