diff options
author | 2015-12-01 12:11:31 +0000 | |
---|---|---|
committer | 2015-12-01 12:11:31 +0000 | |
commit | ac0d6786da8f0cc1329a2a09bbc507eeebf759a8 (patch) | |
tree | a1be08c369056af8d30bcbe9b6bac8662afe00f4 | |
parent | This RTM_GET case can't trigger due to the filtering done above. (diff) | |
download | wireguard-openbsd-ac0d6786da8f0cc1329a2a09bbc507eeebf759a8.tar.xz wireguard-openbsd-ac0d6786da8f0cc1329a2a09bbc507eeebf759a8.zip |
Use setsockopt(ROUTE_MSGFILTER) instead of hand-rolled filtering.
ok florian@
-rw-r--r-- | usr.sbin/rtadvd/if.c | 8 | ||||
-rw-r--r-- | usr.sbin/rtadvd/if.h | 4 | ||||
-rw-r--r-- | usr.sbin/rtadvd/rtadvd.c | 23 |
3 files changed, 20 insertions, 15 deletions
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c index f11389741ce..a1a2e221c10 100644 --- a/usr.sbin/rtadvd/if.c +++ b/usr.sbin/rtadvd/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.33 2015/12/01 12:09:36 jca Exp $ */ +/* $OpenBSD: if.c,v 1.34 2015/12/01 12:11:31 jca Exp $ */ /* $KAME: if.c,v 1.17 2001/01/21 15:27:30 itojun Exp $ */ /* @@ -212,10 +212,9 @@ lladdropt_fill(struct sockaddr_dl *sdl, struct nd_opt_hdr *ndopt) return; } -#define FILTER_MATCH(type, filter) ((0x1 << type) & filter) #define SIN6(s) ((struct sockaddr_in6 *)(s)) char * -get_next_msg(char *buf, char *lim, size_t *lenp, int filter) +get_next_msg(char *buf, char *lim, size_t *lenp) { struct rt_msghdr *rtm; struct ifa_msghdr *ifam; @@ -233,8 +232,6 @@ get_next_msg(char *buf, char *lim, size_t *lenp, int filter) } if (rtm->rtm_version != RTM_VERSION) continue; - if (FILTER_MATCH(rtm->rtm_type, filter) == 0) - continue; switch (rtm->rtm_type) { case RTM_ADD: @@ -291,7 +288,6 @@ get_next_msg(char *buf, char *lim, size_t *lenp, int filter) return (char *)rtm; } -#undef FILTER_MATCH struct in6_addr * get_addr(char *buf) diff --git a/usr.sbin/rtadvd/if.h b/usr.sbin/rtadvd/if.h index b63ef5d934b..2e3cc5cb4cd 100644 --- a/usr.sbin/rtadvd/if.h +++ b/usr.sbin/rtadvd/if.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if.h,v 1.10 2015/11/30 20:58:08 jca Exp $ */ +/* $OpenBSD: if.h,v 1.11 2015/12/01 12:11:31 jca Exp $ */ /* $KAME: if.h,v 1.6 2001/01/21 15:37:14 itojun Exp $ */ /* @@ -42,7 +42,7 @@ int if_getmtu(char *); int if_getflags(int, int); int lladdropt_length(struct sockaddr_dl *); void lladdropt_fill(struct sockaddr_dl *, struct nd_opt_hdr *); -char *get_next_msg(char *, char *, size_t *, int); +char *get_next_msg(char *, char *, size_t *); struct in6_addr *get_addr(char *); int get_rtm_ifindex(char *); int get_ifm_ifindex(char *); diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c index 713557a2226..b3b411057a4 100644 --- a/usr.sbin/rtadvd/rtadvd.c +++ b/usr.sbin/rtadvd/rtadvd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtadvd.c,v 1.60 2015/11/30 20:58:08 jca Exp $ */ +/* $OpenBSD: rtadvd.c,v 1.61 2015/12/01 12:11:31 jca Exp $ */ /* $KAME: rtadvd.c,v 1.66 2002/05/29 14:18:36 itojun Exp $ */ /* @@ -348,12 +348,8 @@ rtmsg_input(void) for (next = msg; next < lim; next += len) { int oldifflags; - next = get_next_msg(next, lim, &len, - RTADV_TYPE2BITMASK(RTM_ADD) | - RTADV_TYPE2BITMASK(RTM_DELETE) | - RTADV_TYPE2BITMASK(RTM_NEWADDR) | - RTADV_TYPE2BITMASK(RTM_DELADDR) | - RTADV_TYPE2BITMASK(RTM_IFINFO)); + next = get_next_msg(next, lim, &len); + if (len == 0) break; type = rtmsg_type(next); @@ -1244,8 +1240,21 @@ sock_open(void) static void rtsock_open(void) { + unsigned int rtfilter; + if ((rtsock = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) fatal("socket"); + + rtfilter = + ROUTE_FILTER(RTM_ADD) | + ROUTE_FILTER(RTM_DELETE) | + ROUTE_FILTER(RTM_NEWADDR) | + ROUTE_FILTER(RTM_DELADDR) | + ROUTE_FILTER(RTM_IFINFO); + + if (setsockopt(rtsock, PF_ROUTE, ROUTE_MSGFILTER, + &rtfilter, sizeof(rtfilter)) == -1) + fatal("setsockopt(ROUTE_MSGFILTER)"); } struct rainfo * |