Skip site navigation (1)Skip section navigation (2)
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>