Mercurial > hg > nginx
diff src/core/ngx_hash.c @ 2168:80924319ba05
fix the case when unset domain.tld was matched by *.domain.tld
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 12 Aug 2008 15:28:19 +0000 |
parents | febb71974a35 |
children | a953f73273ee |
line wrap: on
line diff
--- a/src/core/ngx_hash.c Tue Aug 12 13:17:08 2008 +0000 +++ b/src/core/ngx_hash.c Tue Aug 12 15:28:19 2008 +0000 @@ -88,26 +88,32 @@ /* * the 2 low bits of value have the special meaning: - * 00 - value is data pointer, - * 01 - value is pointer to wildcard hash allowing - * "*.example.com" only, + * 00 - value is data pointer for both "example.com" + * and "*.example.com"; + * 01 - value is data pointer for "*.example.com" only; + * 10 - value is pointer to wildcard hash allowing + * both "example.com" and "*.example.com"; * 11 - value is pointer to wildcard hash allowing - * both "example.com" and "*.example.com". + * "*.example.com" only. */ - if ((uintptr_t) value & 1) { + if ((uintptr_t) value & 2) { + + if (n == 0) { + + /* "example.com" */ + + if ((uintptr_t) value & 1) { + return NULL; + } + + hwc = (ngx_hash_wildcard_t *) + ((uintptr_t) value & (uintptr_t) ~3); + return hwc->value; + } hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3); - if (n == 0) { - if ((uintptr_t) value & 2) { - return hwc->value; - - } else { - return NULL; - } - } - value = ngx_hash_find_wc_head(hwc, name, n - 1); if (value) { @@ -117,6 +123,18 @@ return hwc->value; } + if ((uintptr_t) value & 1) { + + if (n == 0) { + + /* "example.com" */ + + return NULL; + } + + return (void *) ((uintptr_t) value & (uintptr_t) ~3); + } + return value; } @@ -162,11 +180,11 @@ /* * the 2 low bits of value have the special meaning: - * 00 - value is data pointer, - * 01 - value is pointer to wildcard hash allowing "example.*". + * 00 - value is data pointer; + * 11 - value is pointer to wildcard hash allowing "example.*". */ - if ((uintptr_t) value & 1) { + if ((uintptr_t) value & 2) { i++; @@ -567,7 +585,10 @@ wdc->value = names[n].value; } - name->value = (void *) ((uintptr_t) wdc | (dot ? 1 : 3)); + name->value = (void *) ((uintptr_t) wdc | (dot ? 3 : 1)); + + } else if (dot) { + name->value = (void *) ((uintptr_t) name->value | 1); } }