diff options
Diffstat (limited to 'src/libs6dns/s6dns_hosts_ip_string.c')
-rw-r--r-- | src/libs6dns/s6dns_hosts_ip_string.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/libs6dns/s6dns_hosts_ip_string.c b/src/libs6dns/s6dns_hosts_ip_string.c index 430f7d3..8d67cb1 100644 --- a/src/libs6dns/s6dns_hosts_ip_string.c +++ b/src/libs6dns/s6dns_hosts_ip_string.c @@ -1,7 +1,6 @@ /* ISC license. */ #include <errno.h> -#include <string.h> #include <skalibs/cdb.h> #include <skalibs/stralloc.h> @@ -14,21 +13,22 @@ extern int s6dns_hosts_ip_string_r (cdb const *c, char const *name, stralloc *sa, unsigned int flags) { s6dns_domain_t d ; - int r ; cdb_data data ; if (!c->map) return 0 ; - if (!s6dns_domain_fromstring(&d, name, strlen(name)) - || !s6dns_domain_noqualify(&d)) return -1 ; - + if (!s6dns_domain_fromstring(&d, name, strlen(name))) return -1 ; + if (!(flags & 2) && !s6dns_domain_noqualify(&d)) return -1 ; { - char tmp[3 + d.len] ; + int r ; + char tmp[4 + d.len] ; tmp[0] = flags & 2 ? 'u' : 'a' ; tmp[1] = flags & 1 ? '6' : '4' ; tmp[2] = ':' ; - memcpy(tmp + 3, d.s, d.len) ; - r = cdb_find(c, &data, tmp, 3 + d.len) ; + r = s6dns_domain_tostring(tmp + 3, d.len + 1, &d) ; + tmp[3 + r] = 0 ; + if (!r) return -1 ; + r = cdb_find(c, &data, tmp, 3 + r) ; + if (r <= 0) return r ; } - if (r <= 0) return r ; if (!data.len) return 0 ; if (data.len & (flags & 1 ? 15 : 3)) return (errno = EPROTO, -1) ; if (!stralloc_catb(sa, data.s, data.len)) return -1 ; |