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 */
 

Reply via email to