Support combination of foo.bar and *.foo.bar

This commit is contained in:
Tim Rühsen 2015-09-15 14:49:53 +02:00
parent fa55bb75c4
commit 597709cb11
1 changed files with 29 additions and 6 deletions

View File

@ -267,7 +267,7 @@ static int _suffix_compare(const _psl_entry_t *s1, const _psl_entry_t *s2)
if ((n = s1->length - s2->length))
return n; /* shorter rules first */
return strcmp(s1->label, s2->label ? s2->label : s2->label_buf);
return strcmp(s1->label ? s1->label : s1->label_buf, s2->label ? s2->label : s2->label_buf);
}
/* needed to sort array of pointers, given to qsort() */
@ -357,6 +357,8 @@ static int _psl_is_public_suffix(const psl_ctx_t *psl, const char *domain)
length_bak = suffix.length;
if ((suffix.label = strchr(suffix.label, '.'))) {
int pos = rule - suffixes;
suffix.label++;
suffix.length = strlen(suffix.label);
suffix.nlabels--;
@ -364,9 +366,30 @@ static int _psl_is_public_suffix(const psl_ctx_t *psl, const char *domain)
if (psl == &_builtin_psl)
rule = bsearch(&suffix, suffixes, countof(suffixes), sizeof(suffixes[0]), (int(*)(const void *, const void *))_suffix_compare);
else
rule = _vector_get(psl->suffixes, _vector_find(psl->suffixes, &suffix));
rule = _vector_get(psl->suffixes, (pos = _vector_find(psl->suffixes, &suffix)));
if (rule) {
if (!rule->wildcard) {
/* Due to binary search ambiguity we need the following check of neighbour entries.
* TODO: The data structures needs a revision: wildcard and non-wildcard entries must be separated. */
if (psl == &_builtin_psl) {
pos = rule - suffixes;
if (pos > 0 && _suffix_compare(rule, &suffixes[pos - 1]) == 0 && suffixes[pos -1].wildcard)
rule = &suffixes[pos - 1];
else if (pos < (int) (countof(suffixes) - 1) && _suffix_compare(rule, &suffixes[pos + 1]) == 0 && suffixes[pos + 1].wildcard)
rule = &suffixes[pos + 1];
} else {
_psl_entry_t *e;
if (pos > 0 && _suffix_compare(rule, e = _vector_get(psl->suffixes, pos - 1)) == 0 && e->wildcard) {
rule = e;
}
else if (pos < psl->suffixes->cur - 1 && _suffix_compare(rule, e = _vector_get(psl->suffixes, pos + 1)) == 0 && e->wildcard) {
rule = e;
}
}
}
if (rule->wildcard) {
/* now that we matched a wildcard, we have to check for an exception */
suffix.label = label_bak;