changeset 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 2cdefc40cabd
children 769f0dd7081e
files src/core/ngx_hash.c
diffstat 1 files changed, 39 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_hash.c
+++ b/src/core/ngx_hash.c
@@ -88,26 +88,32 @@ ngx_hash_find_wc_head(ngx_hash_wildcard_
 
         /*
          * 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 @@ ngx_hash_find_wc_head(ngx_hash_wildcard_
             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 @@ ngx_hash_find_wc_tail(ngx_hash_wildcard_
 
         /*
          * 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 @@ ngx_hash_wildcard_init(ngx_hash_init_t *
                 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);
         }
     }