diff options
| author | Maxim Dounin <mdounin@mdounin.ru> | 2012-03-05 13:17:56 +0000 |
|---|---|---|
| committer | Maxim Dounin <mdounin@mdounin.ru> | 2012-03-05 13:17:56 +0000 |
| commit | 0ffc4c3218a2a1ca45405754c86221d295d00dd1 (patch) | |
| tree | bb48bc87d1bbe75085d4bc6ee711773ba2630ff1 /src/core/ngx_resolver.c | |
| parent | 2d3fff0c5e1adb67991f6ca716e8bec42b2e61a7 (diff) | |
| download | nginx-0ffc4c3218a2a1ca45405754c86221d295d00dd1.tar.gz nginx-0ffc4c3218a2a1ca45405754c86221d295d00dd1.tar.bz2 | |
Merge of r4498:
Fix of rbtree lookup on hash collisions.
Previous code incorrectly assumed that nodes with identical keys are linked
together. This might not be true after tree rebalance.
Patch by Lanshun Zhou.
Diffstat (limited to 'src/core/ngx_resolver.c')
| -rw-r--r-- | src/core/ngx_resolver.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index 7e77b191a..817e65df1 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -1626,20 +1626,15 @@ ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash) /* hash == node->key */ - do { - rn = (ngx_resolver_node_t *) node; - - rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen); - - if (rc == 0) { - return rn; - } + rn = (ngx_resolver_node_t *) node; - node = (rc < 0) ? node->left : node->right; + rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen); - } while (node != sentinel && hash == node->key); + if (rc == 0) { + return rn; + } - break; + node = (rc < 0) ? node->left : node->right; } /* not found */ |
