summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-05-03 19:34:30 -0400
committerGitHub <noreply@github.com>2019-05-03 19:34:30 -0400
commiteaefb842ffb3d40c40f998a78e8fde080f332b0f (patch)
tree944f533be169e99a3f8c53315628a9a2994fdda5
parent4a3608625c52c36acb78469e84d22faf6b58e92e (diff)
parent16927ecd7537faac212b5de40362e36cc15379e6 (diff)
Merge pull request #4254 from opensourcerouting/fixes-for-6.0
[6.0] ldpd: *BSD fixes
-rw-r--r--ldpd/ldpe.c18
-rw-r--r--ldpd/socket.c13
-rw-r--r--zebra/kernel_socket.c2
3 files changed, 23 insertions, 10 deletions
diff --git a/ldpd/ldpe.c b/ldpd/ldpe.c
index 56af76d94e..c16d92f28b 100644
--- a/ldpd/ldpe.c
+++ b/ldpd/ldpe.c
@@ -139,6 +139,16 @@ ldpe(void)
void
ldpe_init(struct ldpd_init *init)
{
+#ifdef __OpenBSD__
+ /* This socket must be open before dropping privileges. */
+ global.pfkeysock = pfkey_init();
+ if (sysdep.no_pfkey == 0) {
+ pfkey_ev = NULL;
+ thread_add_read(master, ldpe_dispatch_pfkey, NULL, global.pfkeysock,
+ &pfkey_ev);
+ }
+#endif
+
/* drop privileges */
ldpe_privs.user = init->user;
ldpe_privs.group = init->group;
@@ -159,14 +169,6 @@ ldpe_init(struct ldpd_init *init)
fatal("inet_pton");
if (inet_pton(AF_INET6, AllRouters_v6, &global.mcast_addr_v6) != 1)
fatal("inet_pton");
-#ifdef __OpenBSD__
- global.pfkeysock = pfkey_init();
- if (sysdep.no_pfkey == 0) {
- pfkey_ev = NULL;
- thread_add_read(master, ldpe_dispatch_pfkey, NULL, global.pfkeysock,
- &pfkey_ev);
- }
-#endif
/* mark sockets as closed */
global.ipv4.ldp_disc_socket = -1;
diff --git a/ldpd/socket.c b/ldpd/socket.c
index bebd7a7d61..78a07b1ed4 100644
--- a/ldpd/socket.c
+++ b/ldpd/socket.c
@@ -268,9 +268,18 @@ sock_set_bindany(int fd, int enable)
return (-1);
}
return (0);
+#elif defined(IP_BINDANY)
+ frr_elevate_privs(&ldpd_privs) {
+ if (setsockopt(fd, IPPROTO_IP, IP_BINDANY, &enable, sizeof(int))
+ < 0) {
+ log_warn("%s: error setting IP_BINDANY", __func__);
+ return (-1);
+ }
+ }
#else
- log_warnx("%s: missing SO_BINDANY and IP_FREEBIND, unable to bind "
- "to a nonlocal IP address", __func__);
+ log_warnx(
+ "%s: missing SO_BINDANY, IP_FREEBIND and IP_BINDANY, unable to bind to a nonlocal IP address",
+ __func__);
return (-1);
#endif /* HAVE_SO_BINDANY */
}
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index 3721ed52a3..25007d6c8c 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -194,7 +194,9 @@ const struct message rtm_type_str[] = {{RTM_ADD, "RTM_ADD"},
{RTM_LOSING, "RTM_LOSING"},
{RTM_REDIRECT, "RTM_REDIRECT"},
{RTM_MISS, "RTM_MISS"},
+#ifdef RTM_LOCK
{RTM_LOCK, "RTM_LOCK"},
+#endif /* RTM_LOCK */
#ifdef OLDADD
{RTM_OLDADD, "RTM_OLDADD"},
#endif /* RTM_OLDADD */