summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpf <mpf@openbsd.org>2006-09-16 11:35:18 +0000
committermpf <mpf@openbsd.org>2006-09-16 11:35:18 +0000
commit7bb67f2090becb1b43bfd5dabe7418f15be40a0d (patch)
treea93368f38d790d69e6adff35cf93b9ef5154ad13
parentsync printing w/ sysctl and also add missing sensor types to the conf parser; deraadt@ ok (diff)
downloadwireguard-openbsd-7bb67f2090becb1b43bfd5dabe7418f15be40a0d.tar.xz
wireguard-openbsd-7bb67f2090becb1b43bfd5dabe7418f15be40a0d.zip
Only interpret link state routing messages for the monitored carp interface.
memcpy the if_msghdr to avoid alignment problems. OK hshoexer@, miod@, deraadt@
-rw-r--r--usr.sbin/sasyncd/carp.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/usr.sbin/sasyncd/carp.c b/usr.sbin/sasyncd/carp.c
index 06b35b4c309..974ea923dff 100644
--- a/usr.sbin/sasyncd/carp.c
+++ b/usr.sbin/sasyncd/carp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: carp.c,v 1.6 2006/09/01 01:13:25 mpf Exp $ */
+/* $OpenBSD: carp.c,v 1.7 2006/09/16 11:35:18 mpf Exp $ */
/*
* Copyright (c) 2005 Håkan Olsson. All rights reserved.
@@ -193,15 +193,21 @@ static void
carp_read(void)
{
char msg[2048];
- struct if_msghdr *ifm = (struct if_msghdr *)&msg;
+ struct rt_msghdr *rtm = (struct rt_msghdr *)&msg;
+ struct if_msghdr ifm;
int len;
len = read(cfgstate.route_socket, msg, sizeof(msg));
- if (len >= sizeof(struct if_msghdr) &&
- ifm->ifm_version == RTM_VERSION &&
- ifm->ifm_type == RTM_IFINFO)
- carp_update_state(carp_map_state(ifm->ifm_data.ifi_link_state));
+ if (len < sizeof(struct rt_msghdr) ||
+ rtm->rtm_version != RTM_VERSION ||
+ rtm->rtm_type != RTM_IFINFO)
+ return;
+
+ memcpy(&ifm, rtm, sizeof(ifm));
+
+ if (ifm.ifm_index == cfgstate.carp_ifindex)
+ carp_update_state(carp_map_state(ifm.ifm_data.ifi_link_state));
}
void