summaryrefslogtreecommitdiffhomepage
path: root/src/http/modules/ngx_http_limit_zone_module.c
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-03-05 13:17:56 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-03-05 13:17:56 +0000
commit0ffc4c3218a2a1ca45405754c86221d295d00dd1 (patch)
treebb48bc87d1bbe75085d4bc6ee711773ba2630ff1 /src/http/modules/ngx_http_limit_zone_module.c
parent2d3fff0c5e1adb67991f6ca716e8bec42b2e61a7 (diff)
downloadnginx-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/http/modules/ngx_http_limit_zone_module.c')
-rw-r--r--src/http/modules/ngx_http_limit_zone_module.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/http/modules/ngx_http_limit_zone_module.c b/src/http/modules/ngx_http_limit_zone_module.c
index d92f5354a..9a8ea87fe 100644
--- a/src/http/modules/ngx_http_limit_zone_module.c
+++ b/src/http/modules/ngx_http_limit_zone_module.c
@@ -194,31 +194,26 @@ ngx_http_limit_zone_handler(ngx_http_request_t *r)
/* hash == node->key */
- do {
- lz = (ngx_http_limit_zone_node_t *) &node->color;
+ lz = (ngx_http_limit_zone_node_t *) &node->color;
- rc = ngx_memn2cmp(vv->data, lz->data, len, (size_t) lz->len);
+ rc = ngx_memn2cmp(vv->data, lz->data, len, (size_t) lz->len);
- if (rc == 0) {
- if ((ngx_uint_t) lz->conn < lzcf->conn) {
- lz->conn++;
- goto done;
- }
-
- ngx_shmtx_unlock(&shpool->mutex);
-
- ngx_log_error(lzcf->log_level, r->connection->log, 0,
- "limiting connections by zone \"%V\"",
- &lzcf->shm_zone->shm.name);
-
- return NGX_HTTP_SERVICE_UNAVAILABLE;
+ if (rc == 0) {
+ if ((ngx_uint_t) lz->conn < lzcf->conn) {
+ lz->conn++;
+ goto done;
}
- node = (rc < 0) ? node->left : node->right;
+ ngx_shmtx_unlock(&shpool->mutex);
- } while (node != sentinel && hash == node->key);
+ ngx_log_error(lzcf->log_level, r->connection->log, 0,
+ "limiting connections by zone \"%V\"",
+ &lzcf->shm_zone->shm.name);
+
+ return NGX_HTTP_SERVICE_UNAVAILABLE;
+ }
- break;
+ node = (rc < 0) ? node->left : node->right;
}
n = offsetof(ngx_rbtree_node_t, color)