Fix issue #87: ulabel to alabel fails on stringprep_locale_to_utf8.

This commit is contained in:
W.C.A. Wijngaards 2014-02-04 09:49:12 +01:00
parent 02e159c935
commit ebf928ce84
1 changed files with 29 additions and 7 deletions

View File

@ -100,17 +100,39 @@ getdns_convert_ulabel_to_alabel(const char *ulabel)
int ret; int ret;
char *buf; char *buf;
char *prepped; char *prepped;
char *prepped2;
if (ulabel == NULL) if (ulabel == NULL)
return 0; return 0;
prepped2 = malloc(BUFSIZ);
if(!prepped2)
return 0;
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
if ((prepped = stringprep_locale_to_utf8(ulabel)) == 0) if ((prepped = stringprep_locale_to_utf8(ulabel)) == 0) {
return 0; /* convert to utf8 fails, which it can, but continue anyway */
if ((ret = stringprep(prepped, BUFSIZ, 0, stringprep_nameprep)) != STRINGPREP_OK) if(strlen(ulabel)+1 > BUFSIZ) {
return 0; free(prepped2);
if ((ret = idna_to_ascii_8z(prepped, &buf, 0)) != IDNA_SUCCESS) {
return 0; return 0;
} }
memcpy(prepped2, ulabel, strlen(ulabel)+1);
} else {
if(strlen(prepped)+1 > BUFSIZ) {
free(prepped);
free(prepped2);
return 0;
}
memcpy(prepped2, prepped, strlen(prepped)+1);
free(prepped);
}
if ((ret = stringprep(prepped2, BUFSIZ, 0, stringprep_nameprep)) != STRINGPREP_OK) {
free(prepped2);
return 0;
}
if ((ret = idna_to_ascii_8z(prepped2, &buf, 0)) != IDNA_SUCCESS) {
free(prepped2);
return 0;
}
free(prepped2);
return buf; return buf;
} }