Module Name: src Committed By: chs Date: Mon Nov 23 00:52:53 UTC 2020
Modified Files: src/sys/kern: uipc_socket.c src/sys/netinet: tcp_usrreq.c src/sys/sys: socketvar.h Log Message: Restore correct functioning of SIOCATMARK by removing the previous change that was done to fix poll(POLLPRI | POLLRDBAND) and instead add a separate flag to track when poll() should indicate that a MSG_OOB byte is available. Re-fixes PR 54435 properly. To generate a diff of this commit: cvs rdiff -u -r1.292 -r1.293 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.227 -r1.228 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.162 -r1.163 src/sys/sys/socketvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.292 src/sys/kern/uipc_socket.c:1.293 --- src/sys/kern/uipc_socket.c:1.292 Sat Oct 17 09:06:15 2020 +++ src/sys/kern/uipc_socket.c Mon Nov 23 00:52:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.292 2020/10/17 09:06:15 mlelstv Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.293 2020/11/23 00:52:53 chs Exp $ */ /* * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.292 2020/10/17 09:06:15 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.293 2020/11/23 00:52:53 chs Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1186,9 +1186,6 @@ soreceive(struct socket *so, struct mbuf MIN(uio->uio_resid, m->m_len), uio); m = m_free(m); } while (uio->uio_resid > 0 && error == 0 && m); - /* We consumed the oob data, no more oobmark. */ - so->so_oobmark = 0; - so->so_state &= ~SS_RCVATMARK; bad: if (m != NULL) m_freem(m); @@ -1565,6 +1562,8 @@ dontblock: if (offset == so->so_oobmark) break; } + } else { + so->so_state &= ~SS_POLLRDBAND; } if (flags & MSG_EOR) break; @@ -2214,6 +2213,7 @@ void sohasoutofband(struct socket *so) { + so->so_state |= SS_POLLRDBAND; fownsignal(so->so_pgid, SIGURG, POLL_PRI, POLLPRI|POLLRDBAND, so); selnotify(&so->so_rcv.sb_sel, POLLPRI | POLLRDBAND, NOTE_SUBMIT); } @@ -2388,7 +2388,7 @@ sodopoll(struct socket *so, int events) revents |= events & (POLLOUT | POLLWRNORM); if (events & (POLLPRI | POLLRDBAND)) - if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) + if (so->so_state & SS_POLLRDBAND) revents |= events & (POLLPRI | POLLRDBAND); return revents; Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.227 src/sys/netinet/tcp_usrreq.c:1.228 --- src/sys/netinet/tcp_usrreq.c:1.227 Sat Oct 17 08:50:38 2020 +++ src/sys/netinet/tcp_usrreq.c Mon Nov 23 00:52:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.227 2020/10/17 08:50:38 mlelstv Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.228 2020/11/23 00:52:53 chs Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.227 2020/10/17 08:50:38 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.228 2020/11/23 00:52:53 chs Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1095,8 +1095,10 @@ tcp_recvoob(struct socket *so, struct mb m->m_len = 1; *mtod(m, char *) = tp->t_iobc; - if ((flags & MSG_PEEK) == 0) + if ((flags & MSG_PEEK) == 0) { tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA); + so->so_state &= ~SS_POLLRDBAND; + } tcp_debug_trace(so, tp, ostate, PRU_RCVOOB); splx(s); Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.162 src/sys/sys/socketvar.h:1.163 --- src/sys/sys/socketvar.h:1.162 Tue Nov 17 03:22:33 2020 +++ src/sys/sys/socketvar.h Mon Nov 23 00:52:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.162 2020/11/17 03:22:33 chs Exp $ */ +/* $NetBSD: socketvar.h,v 1.163 2020/11/23 00:52:53 chs Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -197,12 +197,12 @@ struct socket { #define SS_RCVATMARK 0x040 /* at mark on input */ #define SS_ISABORTING 0x080 /* aborting fd references - close() */ #define SS_RESTARTSYS 0x100 /* restart blocked system calls */ -#define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */ - +#define SS_POLLRDBAND 0x200 /* poll should return POLLRDBAND */ #define SS_MORETOCOME 0x400 /* * hint from sosend to lower layer; * more data coming */ +#define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */ #define SS_ISAPIPE 0x1000 /* socket is implementing a pipe */ #define SS_NBIO 0x2000 /* socket is in non blocking I/O */