From 485d245ec0f48cff273377bc5babacd8641a2668 Mon Sep 17 00:00:00 2001 From: Ed Kellett Date: Sun, 19 Apr 2020 02:16:17 +0100 Subject: [PATCH] Add ipv4-in-ipv6 logic to check_one_kline --- ircd/client.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ircd/client.c b/ircd/client.c index 072d0a4c..9cc059f8 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -583,6 +583,7 @@ check_one_kline(struct ConfItem *kline) int masktype; int bits; struct rb_sockaddr_storage sockaddr; + struct sockaddr_in ip4; masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits); @@ -601,9 +602,15 @@ check_one_kline(struct ConfItem *kline) /* match one kline */ switch (masktype) { case HM_IPV4: + if (client_p->localClient->ip.ss_family == AF_INET6 && + rb_ipv4_from_ipv6((struct sockaddr_in6 *)&client_p->localClient->ip, &ip4) + && comp_with_mask_sock((struct sockaddr *)&ip4, (struct sockaddr *)&sockaddr, bits)) + matched = 1; + /* fallthrough */ case HM_IPV6: - if (comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip, - (struct sockaddr *)&sockaddr, bits)) + if (client_p->localClient->ip.ss_family == sockaddr.ss_family && + comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip, + (struct sockaddr *)&sockaddr, bits)) matched = 1; break; case HM_HOST: