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);
         }
     }