Module Name:    src
Committed By:   christos
Date:           Sun Nov  4 16:30:29 UTC 2018

Modified Files:
        src/external/bsd/dhcpcd/dist/src: dhcp.c dhcp6.c if-bsd.c ipv6nd.c
        src/lib/libc/sys: getsockopt.2
        src/share/man/man7: sysctl.7
        src/sys/kern: uipc_socket.c uipc_socket2.c
        src/sys/sys: socket.h

Log Message:
- Introduce a new SO_RERROR socket option to explicitly turn on
  receive overflow errors re-instating the default behavior to
  silently ignore them as before 2018-03-19.
- Introduce a new kern.sooptions sysctl to control the default
  behavior of socket options. Setting this to 0x4000 (SO_RERROR),
  turns on receive overflow error reporting for all sockets.
- Change dhcpcd to turn on SO_RERROR on all its sockets.

As discussed in tech-net.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/dhcpcd/dist/src/dhcp.c
cvs rdiff -u -r1.1.1.13 -r1.2 src/external/bsd/dhcpcd/dist/src/dhcp6.c
cvs rdiff -u -r1.1.1.9 -r1.2 src/external/bsd/dhcpcd/dist/src/if-bsd.c
cvs rdiff -u -r1.1.1.8 -r1.2 src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.37 -r1.38 src/lib/libc/sys/getsockopt.2
cvs rdiff -u -r1.134 -r1.135 src/share/man/man7/sysctl.7
cvs rdiff -u -r1.265 -r1.266 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.132 -r1.133 src/sys/kern/uipc_socket2.c
cvs rdiff -u -r1.128 -r1.129 src/sys/sys/socket.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.13 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.14
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.13	Mon Aug 20 06:55:59 2018
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c	Sun Nov  4 11:30:28 2018
@@ -1604,6 +1604,11 @@ dhcp_openudp(struct interface *ifp)
 	n = 1;
 	if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1)
 		goto eexit;
+#ifdef SO_RERROR
+	n = 1;
+	if (setsockopt(s, SOL_SOCKET, SO_RERROR, &n, sizeof(n)) == -1)
+		goto eexit;
+#endif
 	memset(&sin, 0, sizeof(sin));
 	sin.sin_family = AF_INET;
 	sin.sin_port = htons(BOOTPC);

Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.1.1.13 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.2
--- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.1.1.13	Mon Aug 20 06:55:03 2018
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.c	Sun Nov  4 11:30:28 2018
@@ -3620,6 +3620,11 @@ dhcp6_listen(struct dhcpcd_ctx *ctx, str
 	if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n)) == -1)
 		goto errexit;
 
+#ifdef SO_RERROR
+	n = 1;
+	if (setsockopt(s, SOL_SOCKET, SO_RERROR, &n, sizeof(n)) == -1)
+		goto errexit;
+#endif
 	memset(&sa, 0, sizeof(sa));
 	sa.sin6_family = AF_INET6;
 	sa.sin6_port = htons(DHCP6_CLIENT_PORT);

Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.1.1.9 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.2
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.1.1.9	Mon Aug 20 06:55:03 2018
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c	Sun Nov  4 11:30:28 2018
@@ -161,6 +161,12 @@ if_opensockets_os(struct dhcpcd_ctx *ctx
 	if (ctx->link_fd == -1)
 		return -1;
 
+#ifdef SO_RERROR
+	int n = 1;
+	if (setsockopt(ctx->link_fd, SOL_SOCKET, SO_RERROR,
+	    &n, sizeof(n)) == -1)
+		logerr(__func__);
+#endif
 #if defined(RO_MSGFILTER)
 	if (setsockopt(ctx->link_fd, PF_ROUTE, RO_MSGFILTER,
 	    &msgfilter, sizeof(msgfilter)) == -1)

Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.1.1.8 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.2
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.1.1.8	Wed May  2 18:06:41 2018
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c	Sun Nov  4 11:30:28 2018
@@ -217,6 +217,13 @@ ipv6nd_open(struct dhcpcd_ctx *ctx)
 	    &on, sizeof(on)) == -1)
 		goto eexit;
 
+#ifdef SO_RERROR
+	on = 1;
+	if (setsockopt(ctx->nd_fd, SOL_SOCKET, SO_RERROR,
+	    &on, sizeof(on)) == -1)
+		goto eexit;
+#endif
+
 	ICMP6_FILTER_SETBLOCKALL(&filt);
 	ICMP6_FILTER_SETPASS(ND_NEIGHBOR_ADVERT, &filt);
 	ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt);

Index: src/lib/libc/sys/getsockopt.2
diff -u src/lib/libc/sys/getsockopt.2:1.37 src/lib/libc/sys/getsockopt.2:1.38
--- src/lib/libc/sys/getsockopt.2:1.37	Tue Jul 31 18:28:26 2018
+++ src/lib/libc/sys/getsockopt.2	Sun Nov  4 11:30:28 2018
@@ -1,4 +1,4 @@
-.\"	$NetBSD: getsockopt.2,v 1.37 2018/07/31 22:28:26 sevan Exp $
+.\"	$NetBSD: getsockopt.2,v 1.38 2018/11/04 16:30:28 christos Exp $
 .\"
 .\" Copyright (c) 1983, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"     @(#)getsockopt.2	8.4 (Berkeley) 5/2/95
 .\"
-.Dd July 31, 2018
+.Dd November 3, 2018
 .Dt GETSOCKOPT 2
 .Os
 .Sh NAME
@@ -179,6 +179,7 @@ and set with
 .It Dv SO_RCVTIMEO Ta "set timeout value for input"
 .It Dv SO_TIMESTAMP Ta "enables reception of a timestamp with datagrams"
 .It Dv SO_ACCEPTFILTER Ta "set accept filter on listening socket"
+.It Dv SO_RERROR Ta "enables receive size error reporting"
 .It Dv SO_NOSIGPIPE Ta
 controls generation of
 .Dv SIGPIPE
@@ -213,6 +214,19 @@ indicates that outgoing messages should
 bypass the standard routing facilities.
 Instead, messages are directed to the appropriate network interface
 according to the network portion of the destination address.
+.Dv SO_RERROR
+indicates that receive buffer overflows should be handled as errors.
+Historically receive buffer overflows have been ignored and programs
+could not tell if they missed messages or messages had been truncated
+because of overflows.
+Since programs historically do not expect to get receive overflow errors,
+this behavior is not the default, but the default can be changed by
+setting the
+.Dv SO_RERROR
+flag using
+.Xr sysctl 1
+and
+.Dv kern.sooptions .
 .Pp
 .Dv SO_LINGER
 controls the action taken when unsent messages

Index: src/share/man/man7/sysctl.7
diff -u src/share/man/man7/sysctl.7:1.134 src/share/man/man7/sysctl.7:1.135
--- src/share/man/man7/sysctl.7:1.134	Tue Oct 30 15:41:21 2018
+++ src/share/man/man7/sysctl.7	Sun Nov  4 11:30:28 2018
@@ -1,4 +1,4 @@
-.\"	$NetBSD: sysctl.7,v 1.134 2018/10/30 19:41:21 kre Exp $
+.\"	$NetBSD: sysctl.7,v 1.135 2018/11/04 16:30:28 christos Exp $
 .\"
 .\" Copyright (c) 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	@(#)sysctl.3	8.4 (Berkeley) 5/9/95
 .\"
-.Dd October 30, 2018
+.Dd November 3, 2018
 .Dt SYSCTL 7
 .Os
 .Sh NAME
@@ -359,6 +359,7 @@ privilege may change the value.
 .It kern.sched	node	not applicable
 .It kern.securelevel	integer	raise only
 .It kern.somaxkva	integer	yes
+.It kern.sooptions	integer	yes
 .It kern.synchronized_io	integer	no
 .It kern.timecounter	node	not applicable
 .It kern.timex	struct	no
@@ -1062,8 +1063,7 @@ Return the offset of real time clock fro
 .It Li kern.saved_ids ( Dv KERN_SAVED_IDS )
 Returns 1 if saved set-group and saved set-user ID is available.
 .It Li kern.sbmax ( Dv KERN_SBMAX )
-Maximum socket buffer size.
-.\" XXX units?
+Maximum socket buffer size in bytes.
 .It Li kern.securelevel ( Dv KERN_SECURELVL )
 See
 .Xr secmodel_securelevel 9 .
@@ -1166,8 +1166,14 @@ See
 .Xr sched 3 .
 .El
 .It Li kern.somaxkva ( Dv KERN_SOMAXKVA )
-Maximum amount of kernel memory to be used for socket buffers.
-.\" XXX units?
+Maximum amount of kernel memory to be used for socket buffers in bytes.
+.It Li kern.sooptions
+Set the default socket option flags for
+.Xr socket 2
+creation.
+See
+.Xr setsockopt 2
+for a list of supported flags.
 .It Li kern.synchronized_io ( Dv KERN_SYNCHRONIZED_IO )
 Returns 1 if the
 .St -p1003.1b-93

Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.265 src/sys/kern/uipc_socket.c:1.266
--- src/sys/kern/uipc_socket.c:1.265	Mon Sep  3 12:29:35 2018
+++ src/sys/kern/uipc_socket.c	Sun Nov  4 11:30:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.265 2018/09/03 16:29:35 riastradh Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.266 2018/11/04 16:30:29 christos 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.265 2018/09/03 16:29:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.266 2018/11/04 16:30:29 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -118,6 +118,7 @@ MALLOC_DEFINE(M_SONAME, "soname", "socke
 
 extern const struct fileops socketops;
 
+static int	sooptions;
 extern int	somaxconn;			/* patchable (XXX sysctl) */
 int		somaxconn = SOMAXCONN;
 kmutex_t	*softnet_lock;
@@ -537,6 +538,7 @@ socreate(int dom, struct socket **aso, i
 	so->so_proto = prp;
 	so->so_send = sosend;
 	so->so_receive = soreceive;
+	so->so_options = sooptions;
 #ifdef MBUFTRACE
 	so->so_rcv.sb_mowner = &prp->pr_domain->dom_mowner;
 	so->so_snd.sb_mowner = &prp->pr_domain->dom_mowner;
@@ -1757,6 +1759,7 @@ sosetopt1(struct socket *so, const struc
 	case SO_OOBINLINE:
 	case SO_TIMESTAMP:
 	case SO_NOSIGPIPE:
+	case SO_RERROR:
 #ifdef SO_OTIMESTAMP
 	case SO_OTIMESTAMP:
 #endif
@@ -1958,6 +1961,7 @@ sogetopt1(struct socket *so, struct sock
 	case SO_OOBINLINE:
 	case SO_TIMESTAMP:
 	case SO_NOSIGPIPE:
+	case SO_RERROR:
 #ifdef SO_OTIMESTAMP
 	case SO_OTIMESTAMP:
 #endif
@@ -2522,6 +2526,31 @@ sysctl_kern_sbmax(SYSCTLFN_ARGS)
 	return (error);
 }
 
+/*
+ * sysctl helper routine for kern.sooptions. Ensures that only allowed
+ * options can be set.
+ */
+static int
+sysctl_kern_sooptions(SYSCTLFN_ARGS)
+{
+	int error, new_options;
+	struct sysctlnode node;
+
+	new_options = sooptions;
+	node = *rnode;
+	node.sysctl_data = &new_options;
+	error = sysctl_lookup(SYSCTLFN_CALL(&node));
+	if (error || newp == NULL)
+		return error;
+
+	if (new_options & ~SO_DEFOPTS)
+		return EINVAL;
+
+	sooptions = new_options;
+
+	return 0;
+}
+
 static void
 sysctl_kern_socket_setup(void)
 {
@@ -2542,4 +2571,11 @@ sysctl_kern_socket_setup(void)
 		       SYSCTL_DESCR("Maximum socket buffer size"),
 		       sysctl_kern_sbmax, 0, NULL, 0,
 		       CTL_KERN, KERN_SBMAX, CTL_EOL);
+
+	sysctl_createv(&socket_sysctllog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+		       CTLTYPE_INT, "sooptions",
+		       SYSCTL_DESCR("Default socket options"),
+		       sysctl_kern_sooptions, 0, NULL, 0,
+		       CTL_KERN, CTL_CREATE, CTL_EOL);
 }

Index: src/sys/kern/uipc_socket2.c
diff -u src/sys/kern/uipc_socket2.c:1.132 src/sys/kern/uipc_socket2.c:1.133
--- src/sys/kern/uipc_socket2.c:1.132	Mon Sep  3 12:29:35 2018
+++ src/sys/kern/uipc_socket2.c	Sun Nov  4 11:30:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket2.c,v 1.132 2018/09/03 16:29:35 riastradh Exp $	*/
+/*	$NetBSD: uipc_socket2.c,v 1.133 2018/11/04 16:30:29 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.132 2018/09/03 16:29:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.133 2018/11/04 16:30:29 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -509,8 +509,10 @@ soroverflow(struct socket *so)
 	KASSERT(solocked(so));
 
 	so->so_rcv.sb_overflowed++;
-	so->so_rerror = ENOBUFS;
-	sorwakeup(so);
+	if (so->so_options & SO_RERROR)  {
+		so->so_rerror = ENOBUFS;
+		sorwakeup(so);
+	}
 }
 
 /*

Index: src/sys/sys/socket.h
diff -u src/sys/sys/socket.h:1.128 src/sys/sys/socket.h:1.129
--- src/sys/sys/socket.h:1.128	Sun Sep 16 16:40:20 2018
+++ src/sys/sys/socket.h	Sun Nov  4 11:30:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: socket.h,v 1.128 2018/09/16 20:40:20 mrg Exp $	*/
+/*	$NetBSD: socket.h,v 1.129 2018/11/04 16:30:29 christos Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -132,7 +132,30 @@ typedef	_BSD_SSIZE_T_	ssize_t;
 #define	SO_NOSIGPIPE	0x0800		/* no SIGPIPE from EPIPE */
 #define	SO_ACCEPTFILTER	0x1000		/* there is an accept filter */
 #define	SO_TIMESTAMP	0x2000		/* timestamp received dgram traffic */
+#define	SO_RERROR	0x4000		/* Keep track of receive errors */
 
+/* Allowed default option flags */
+#define SO_DEFOPTS	(SO_DEBUG|SO_REUSEADDR|SO_KEEPALIVE|SO_DONTROUTE| \
+    SO_BROADCAST|SO_USELOOPBACK|SO_LINGER|SO_OOBINLINE|SO_REUSEPORT| \
+    SO_NOSIGPIPE|SO_TIMESTAMP|SO_RERROR)
+
+#define __SO_OPTION_BITS \
+	"\20" \
+	"\1SO_DEBUG" \
+	"\2SO_ACCEPTCONN" \
+	"\3SO_REUSEADDR" \
+	"\4SO_KEEPALIVE" \
+	"\5SO_DONTROUTE" \
+	"\6SO_BROADCAST" \
+	"\7SO_USELOOPBACK" \
+	"\10SO_LINGER" \
+	"\11SO_OOBINLINE" \
+	"\12SO_REUSEPORT" \
+	"\13SO_OTIMESTAMP" \
+	"\14SO_NOSIGPIPE" \
+	"\15SO_ACCEPTFILTER" \
+	"\16SO_TIMESTAMP" \
+	"\17SO_RERROR"
 
 /*
  * Additional options, not kept in so_options.

Reply via email to