From 6fd052590f00d8e531402600492ef54ca9457614 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Tue, 22 Jan 2019 14:51:42 +0000 Subject: [PATCH] BSD: Turn on SO_RERROR for all sockets So we can detect IPv6ND or DHCPv6 overflow as well as route(4) overflow. --- src/if-bsd.c | 10 ---------- src/if.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/if-bsd.c b/src/if-bsd.c index facc945c..e4c95765 100644 --- a/src/if-bsd.c +++ b/src/if-bsd.c @@ -170,16 +170,6 @@ if_opensockets_os(struct dhcpcd_ctx *ctx) &n, sizeof(n)) == -1) logerr("%s: SO_USELOOPBACK", __func__); -#ifdef SO_RERROR - /* Tell recvmsg(2) to return ENOBUFS if the receiving socket overflows - * from too many route(4) messages so we can re-sync our state - * with reality. */ - n = 1; - if (setsockopt(ctx->link_fd, SOL_SOCKET, SO_RERROR, - &n, sizeof(n)) == -1) - logerr("%s: SO_RERROR", __func__); -#endif - #if defined(RO_MSGFILTER) if (setsockopt(ctx->link_fd, PF_ROUTE, RO_MSGFILTER, &msgfilter, sizeof(msgfilter)) == -1) diff --git a/src/if.c b/src/if.c index 7807d89b..2aa28190 100644 --- a/src/if.c +++ b/src/if.c @@ -790,6 +790,9 @@ xsocket(int domain, int type, int protocol) #if !defined(HAVE_SOCK_CLOEXEC) || !defined(HAVE_SOCK_NONBLOCK) int xflags, xtype = type; #endif +#ifdef SO_RERROR + int on; +#endif #ifndef HAVE_SOCK_CLOEXEC if (xtype & SOCK_CLOEXEC) @@ -814,6 +817,13 @@ xsocket(int domain, int type, int protocol) goto out; #endif +#ifdef SO_RERROR + /* Tell recvmsg(2) to return ENOBUFS if the receiving socket overflows. */ + on = 1; + if (setsockopt(s, SOL_SOCKET, SO_RERROR, &on, sizeof(on)) == -1) + logerr("%s: SO_RERROR", __func__); +#endif + return s; #if !defined(HAVE_SOCK_CLOEXEC) || !defined(HAVE_SOCK_NONBLOCK) -- 2.47.2