diff --git a/src/dns_client.c b/src/dns_client.c index 25a2882..407b86a 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -3414,9 +3414,11 @@ static int _dns_client_setup_server_packet(struct dns_server_info *server_info, dns_set_OPT_payload_size(packet, DNS_IN_PACKSIZE); /* dns_add_OPT_TCP_KEEPALIVE(packet, 600); */ - if (query->qtype == DNS_T_A && server_info->ecs_ipv4.enable) { + if ((query->qtype == DNS_T_A && server_info->ecs_ipv4.enable) || + (query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable == 0 && server_info->ecs_ipv4.enable)) { dns_add_OPT_ECS(packet, &server_info->ecs_ipv4.ecs); - } else if (query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable) { + } else if ((query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable) || + (query->qtype == DNS_T_A && server_info->ecs_ipv4.enable == 0 && server_info->ecs_ipv6.enable)) { dns_add_OPT_ECS(packet, &server_info->ecs_ipv6.ecs); } diff --git a/src/dns_conf.c b/src/dns_conf.c index 8d210d8..cadf224 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -2562,9 +2562,6 @@ static int _conf_client_subnet(char *subnet, struct dns_edns_client_subnet *ipv4 *slash = 0; slash++; subnet_len = atoi(slash); - if (subnet_len < 0 || subnet_len > 128) { - return -1; - } } if (getaddr_by_host(str_subnet, (struct sockaddr *)&addr, &addr_len) != 0) { @@ -2573,9 +2570,23 @@ static int _conf_client_subnet(char *subnet, struct dns_edns_client_subnet *ipv4 switch (addr.ss_family) { case AF_INET: + if (subnet_len < 0 || subnet_len > 32) { + return -1; + } + + if (subnet_len == 0) { + subnet_len = 32; + } ecs = ipv4_ecs; break; case AF_INET6: + if (subnet_len < 0 || subnet_len > 128) { + return -1; + } + + if (subnet_len == 0) { + subnet_len = 128; + } ecs = ipv6_ecs; break; default: