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
This commit is contained in:
Mark Johnston 2021-09-12 16:05:49 -04:00
parent e31cc1d526
commit b864b67a0d

View File

@ -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: