diff --git a/include/types/dns.h b/include/types/dns.h index 59b59c765..f8edb734c 100644 --- a/include/types/dns.h +++ b/include/types/dns.h @@ -212,6 +212,7 @@ enum { * matching preference was found */ DNS_UPD_CNAME, /* CNAME without any IP provided in the response */ DNS_UPD_NAME_ERROR, /* name in the response did not match the query */ + DNS_UPD_NO_IP_FOUND, /* no IP could be found in the response */ }; #endif /* _TYPES_DNS_H */ diff --git a/src/dns.c b/src/dns.c index 4dfe69790..d002f1b93 100644 --- a/src/dns.c +++ b/src/dns.c @@ -724,6 +724,11 @@ int dns_get_ip_from_response(unsigned char *resp, unsigned char *resp_end, return DNS_UPD_CNAME; } + /* no IP found in the response */ + if (!newip4 && !newip6) { + return DNS_UPD_NO_IP_FOUND; + } + /* case when the caller looks first for an IPv4 address */ if (family_priority == AF_INET) { if (newip4) { diff --git a/src/server.c b/src/server.c index 4e06ad22a..8bc3165c7 100644 --- a/src/server.c +++ b/src/server.c @@ -2049,6 +2049,13 @@ int snr_resolution_cb(struct dns_resolution *resolution, struct dns_nameserver * } goto invalid; + case DNS_UPD_NO_IP_FOUND: + if (resolution->status != RSLV_STATUS_OTHER) { + resolution->status = RSLV_STATUS_OTHER; + resolution->last_status_change = now_ms; + } + goto stop_resolution; + default: goto invalid;