changeset 5058:607d2d75b835 draft

BSD: Fix processing RTM_MISS for non NetBSD BSDs
author Roy Marples <roy@marples.name>
date Sun, 09 Feb 2020 16:57:27 +0000
parents a5fd2097d40f
children bd0bfd64aa0e
files src/if-bsd.c
diffstat 1 files changed, 26 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/if-bsd.c	Sat Feb 08 17:29:03 2020 +0000
+++ b/src/if-bsd.c	Sun Feb 09 16:57:27 2020 +0000
@@ -768,6 +768,29 @@
 	return 0;
 }
 
+static bool
+if_realroute(const struct rt_msghdr *rtm)
+{
+
+#ifdef RTF_CLONED
+	if (rtm->rtm_flags & RTF_CLONED)
+		return false;
+#endif
+#ifdef RTF_WASCLONED
+	if (rtm->rtm_flags & RTF_WASCLONED)
+		return false;
+#endif
+#ifdef RTF_LOCAL
+	if (rtm->rtm_flags & RTF_LOCAL)
+		return false;
+#endif
+#ifdef RTF_BROADCAST
+	if (rtm->rtm_flags & RTF_BROADCAST)
+		return false;
+#endif
+	return true;
+}
+
 static int
 if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm)
 {
@@ -781,30 +804,6 @@
 		errno = EINVAL;
 		return -1;
 	}
-#ifdef RTF_CLONED
-	if (rtm->rtm_flags & RTF_CLONED) {
-		errno = ENOTSUP;
-		return -1;
-	}
-#endif
-#ifdef RTF_WASCLONED
-	if (rtm->rtm_flags & RTF_WASCLONED) {
-		errno = ENOTSUP;
-		return -1;
-	}
-#endif
-#ifdef RTF_LOCAL
-	if (rtm->rtm_flags & RTF_LOCAL) {
-		errno = ENOTSUP;
-		return -1;
-	}
-#endif
-#ifdef RTF_BROADCAST
-	if (rtm->rtm_flags & RTF_BROADCAST) {
-		errno = ENOTSUP;
-		return -1;
-	}
-#endif
 
 	if (get_addrs(rtm->rtm_addrs, (const char *)rtm + sizeof(*rtm),
 	              rtm->rtm_msglen - sizeof(*rtm), rti_info) == -1)
@@ -891,6 +890,8 @@
 			errno = EINVAL;
 			break;
 		}
+		if (!if_realroute(rtm))
+			continue;
 		if (if_copyrt(ctx, &rt, rtm) != 0)
 			continue;
 		if ((rtn = rt_new(rt.rt_ifp)) == NULL) {
@@ -1252,12 +1253,6 @@
 	}
 #endif
 
-#if 0
-	/* Not needed because we turn off SO_USELOOPBACK. */
-	if (rtm->rtm_pid == getpid())
-		return 0;
-#endif
-
 	if (if_copyrt(ctx, &rt, rtm) == -1)
 		return errno == ENOTSUP ? 0 : -1;
 
@@ -1281,7 +1276,7 @@
 	}
 #endif
 
-	if (rtm->rtm_type != RTM_MISS)
+	if (rtm->rtm_type != RTM_MISS && if_realroute(rtm))
 		rt_recvrt(rtm->rtm_type, &rt, rtm->rtm_pid);
 	return 0;
 }