fix the case when unset domain.tld was matched by *.domain.tld
diff --git a/src/core/ngx_hash.c b/src/core/ngx_hash.c
index 023a4e6..d36b142 100644
--- a/src/core/ngx_hash.c
+++ b/src/core/ngx_hash.c
@@ -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) {
-
- hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);
+ if ((uintptr_t) value & 2) {
if (n == 0) {
- if ((uintptr_t) value & 2) {
- return hwc->value;
- } else {
+ /* "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);
+
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);
}
}