From 16dea2e2bd5a1e30725c88294f5844630dd724bc Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 10 Jun 2014 23:37:27 +0100 Subject: stop idna (en/de)code asploding when the passed host begins with a . --- utils/idna.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'utils/idna.c') diff --git a/utils/idna.c b/utils/idna.c index 47c8d9572..b979e4ecf 100644 --- a/utils/idna.c +++ b/utils/idna.c @@ -600,7 +600,12 @@ idna_encode(const char *host, size_t len, char **ace_host, size_t *ace_len) char fqdn[256]; char *output, *fqdn_p = fqdn; - while ((label_len = idna__host_label_length(host, len)) != 0) { + label_len = idna__host_label_length(host, len); + if (label_len == 0) { + return NSERROR_BAD_URL; + } + + while (label_len != 0) { if (idna__is_ldh(host, label_len) == false) { /* This string is IDN or invalid */ @@ -649,6 +654,8 @@ idna_encode(const char *host, size_t len, char **ace_host, size_t *ace_len) } host++; len = len - label_len - 1; + + label_len = idna__host_label_length(host, len); } fqdn_p--; @@ -670,7 +677,12 @@ idna_decode(const char *ace_host, size_t ace_len, char **host, size_t *host_len) char fqdn[256]; char *output, *fqdn_p = fqdn; - while ((label_len = idna__host_label_length(ace_host, ace_len)) != 0) { + label_len = idna__host_label_length(ace_host, ace_len); + if (label_len == 0) { + return NSERROR_BAD_URL; + } + + while (label_len != 0) { if (idna__is_ace(ace_host, label_len) == true) { /* This string is DNS-valid and (probably) encoded */ @@ -705,9 +717,13 @@ idna_decode(const char *ace_host, size_t ace_len, char **host, size_t *host_len) fqdn_len++; ace_host += label_len; - if ((*ace_host == '\0') || (*ace_host == ':')) break; + if ((*ace_host == '\0') || (*ace_host == ':')) { + break; + } ace_host++; ace_len = ace_len - label_len - 1; + + label_len = idna__host_label_length(ace_host, ace_len); } fqdn_p--; -- cgit v1.2.3