summaryrefslogtreecommitdiff
path: root/utils/idna.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-06-10 23:37:27 +0100
committerVincent Sanders <vince@kyllikki.org>2014-06-10 23:38:35 +0100
commit16dea2e2bd5a1e30725c88294f5844630dd724bc (patch)
tree9c0037cacc180fc93cdfb0aa73df5c2f27322956 /utils/idna.c
parent2462f5658e82533e7c1cfbe1afb6975c54aa3896 (diff)
downloadnetsurf-16dea2e2bd5a1e30725c88294f5844630dd724bc.tar.gz
netsurf-16dea2e2bd5a1e30725c88294f5844630dd724bc.tar.bz2
stop idna (en/de)code asploding when the passed host begins with a .
Diffstat (limited to 'utils/idna.c')
-rw-r--r--utils/idna.c22
1 files changed, 19 insertions, 3 deletions
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--;