From 7ca6c1ff782afbb83b9f17d6552566c823247e29 Mon Sep 17 00:00:00 2001 From: Maxim Dounin Date: Mon, 27 Feb 2012 22:15:39 +0000 Subject: 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. --- src/core/ngx_open_file_cache.c | 17 ++++++----------- src/core/ngx_resolver.c | 17 ++++++----------- 2 files changed, 12 insertions(+), 22 deletions(-) (limited to 'src/core') diff --git a/src/core/ngx_open_file_cache.c b/src/core/ngx_open_file_cache.c index 73a2db0c8..c44ac96b8 100644 --- a/src/core/ngx_open_file_cache.c +++ b/src/core/ngx_open_file_cache.c @@ -1142,20 +1142,15 @@ ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name, /* hash == node->key */ - do { - file = (ngx_cached_open_file_t *) node; - - rc = ngx_strcmp(name->data, file->name); + file = (ngx_cached_open_file_t *) node; - if (rc == 0) { - return file; - } + rc = ngx_strcmp(name->data, file->name); - node = (rc < 0) ? node->left : node->right; - - } while (node != sentinel && hash == node->key); + if (rc == 0) { + return file; + } - break; + node = (rc < 0) ? node->left : node->right; } return NULL; diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index 5c516175e..2e3047135 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -1689,20 +1689,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 */ -- cgit