From 5267074938565976b105324ded8a8c5982bb8d5a Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Tue, 16 Jun 2020 22:32:03 +0200 Subject: Make sure igmp socket filter is set and locked --- igmp.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'igmp.c') diff --git a/igmp.c b/igmp.c index 1c44769..14ba516 100644 --- a/igmp.c +++ b/igmp.c @@ -8,6 +8,7 @@ #include #include #include +#include /* Remove later */ #include @@ -488,6 +489,7 @@ igmp_init(struct cfg *cfg) }; struct igmp *igmp; int sfd; + int opt; igmp = zmalloc(sizeof(*igmp)); if (!igmp) @@ -499,14 +501,18 @@ igmp_init(struct cfg *cfg) */ sfd = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_ALL)); if (sfd < 0) { - perror("igmp socket"); + if (errno == EACCES) + verbose("igmp socket: permission denied\n"); + else + error("igmp socket: %m"); goto out_free; } - if (setsockopt(sfd, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) < 0) { - error("igmp setsockopt: %m"); - goto out_fd; - } + if (setsockopt(sfd, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) < 0) + perrordie("igmp setsockopt(SO_ATTACH_FILTER): %m"); + + if (setsockopt(sfd, SOL_SOCKET, SO_LOCK_FILTER, &opt, sizeof(opt)) < 0) + perrordie("igmp setsockopt(SO_LOCK_FILTER): %m"); /* struct ifreq ifreq = { -- cgit v1.2.3