struct Client *client_p;
rb_dlink_node *ptr;
rb_dlink_node *next_ptr;
+ int masktype;
+ int bits;
+ struct rb_sockaddr_storage sockaddr;
+ struct sockaddr_in ip4;
+
+ masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, lclient_list.head)
{
+ int matched = 0;
+
client_p = ptr->data;
if(IsMe(client_p) || !IsPerson(client_p))
continue;
/* match one kline */
- {
- int matched = 0;
- int masktype;
- int bits;
- struct rb_sockaddr_storage sockaddr;
-
- masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
-
- switch (masktype) {
- case HM_IPV4:
- case HM_IPV6:
- if(comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
+ 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 (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;
- case HM_HOST:
- if (match(kline->host, client_p->orighost))
- matched = 1;
- }
-
- if (!matched)
- continue;
+ matched = 1;
+ break;
+ case HM_HOST:
+ if (match(kline->host, client_p->orighost))
+ matched = 1;
+ if (match(kline->host, client_p->sockhost))
+ matched = 1;
+ break;
}
+ if (!matched)
+ continue;
+
if(IsExemptKline(client_p))
{
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,