Date: Sun, 12 Sep 2021 20:39:51 GMT From: Mark Johnston <markj@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: b864b67a0d19 - main - socket: Do not include control messages in FIONREAD return value Message-ID: <202109122039.18CKdpwW094531@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=b864b67a0d197f59ecf6698940600956ceee2cae commit b864b67a0d197f59ecf6698940600956ceee2cae Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2021-09-12 20:05:49 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2021-09-12 20:39:44 +0000 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 --- sys/kern/sys_socket.c | 5 +++-- 1 file 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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109122039.18CKdpwW094531>