fatal("invalid prefix length in '%s': %s\n",
value, isc_result_totext(result));
}
- } else if (strcmp(value, "0") == 0) {
+ }
+
+ if (strcmp(buf, "0") == 0) {
parsed = ISC_TRUE;
prefix_length = 0;
}
}
if (lookup->ecs_addr != NULL) {
- isc_uint8_t addr[16], family;
+ isc_uint8_t addr[16], family, proto;
isc_uint32_t plen;
struct sockaddr *sa;
struct sockaddr_in *sin;
opts[i].length = (isc_uint16_t) addrl + 4;
check_result(result, "isc_buffer_allocate");
isc_buffer_init(&b, ecsbuf, sizeof(ecsbuf));
- switch (sa->sa_family) {
+
+ /* If prefix length is zero, don't set family */
+ proto = sa->sa_family;
+ if (plen == 0)
+ proto = AF_UNSPEC;
+
+ switch (proto) {
case AF_UNSPEC:
INSIST(plen == 0);
family = 0;
}
if (((client->attributes & NS_CLIENTATTR_HAVEECS) != 0) &&
(client->ecs_addr.family == AF_INET ||
- client->ecs_addr.family == AF_INET6))
+ client->ecs_addr.family == AF_INET6 ||
+ client->ecs_addr.family == AF_UNSPEC))
{
int i, addrbytes = (client->ecs_addrlen + 7) / 8;
isc_uint8_t *paddr;
/* Add client subnet option. */
isc_buffer_init(&buf, ecs, sizeof(ecs));
- if (client->ecs_addr.family == AF_INET)
+ if (client->ecs_addr.family == AF_UNSPEC ||
+ client->ecs_addrlen == 0)
+ isc_buffer_putuint16(&buf, 0);
+ else if (client->ecs_addr.family == AF_INET)
isc_buffer_putuint16(&buf, 1);
else
isc_buffer_putuint16(&buf, 2);
uc = paddr[i];
if (i == addrbytes - 1 &&
((client->ecs_addrlen % 8) != 0))
- uc &= (0xffU << (8 - (client->ecs_addrlen % 8)));
+ uc &= (0xffU << (8 -
+ (client->ecs_addrlen % 8)));
isc_buffer_putuint8(&buf, uc);
}
return (DNS_R_OPTERR);
}
- if (addrlen == 0 && family != 0) {
+ if (addrlen == 0U && family != 0U) {
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(2),
"EDNS client-subnet option: "
echo "I:checking dig +subnet=0/0 ($n)"
ret=0
$DIG $DIGOPTS +tcp @10.53.0.2 +subnet=0/0 A a.example > dig.out.test$n 2>&1 || ret=1
- grep "CLIENT-SUBNET: 0.0.0.0/0/0" < dig.out.test$n > /dev/null || ret=1
+ grep "CLIENT-SUBNET: 0/0/0" < dig.out.test$n > /dev/null || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:checking dig +subnet=0 ($n)"
ret=0
$DIG $DIGOPTS +tcp @10.53.0.2 +subnet=0 A a.example > dig.out.test$n 2>&1 || ret=1
- grep "CLIENT-SUBNET: 0.0.0.0/0/0" < dig.out.test$n > /dev/null || ret=1
+ grep "CLIENT-SUBNET: 0/0/0" < dig.out.test$n > /dev/null || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:checking dig +subnet=::/0 ($n)"
ret=0
$DIG $DIGOPTS +tcp @10.53.0.2 +subnet=::/0 A a.example > dig.out.test$n 2>&1 || ret=1
- grep "CLIENT-SUBNET: ::/0/0" < dig.out.test$n > /dev/null || ret=1
+ grep "CLIENT-SUBNET: 0/0/0" < dig.out.test$n > /dev/null || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`