diff options
author | Igor Sysoev <igor@sysoev.ru> | 2005-12-26 17:07:48 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2005-12-26 17:07:48 +0000 |
commit | 305a9d83cfba0d0330bd12af4ca56943b10e958e (patch) | |
tree | 8dc3ead91f77a4ae8953f289f57ff49b4ce9c9f1 /src/core | |
parent | f9cbecc16a9851e8403bf7dae96feebf63b1ac3e (diff) | |
download | nginx-release-0.3.18.tar.gz nginx-release-0.3.18.zip |
nginx-0.3.18-RELEASE importrelease-0.3.18
*) Feature: the "server_names" directive supports the ".domain.tld"
names.
*) Feature: the "server_names" directive uses the hash for the
"*.domain.tld" names and more effective hash for usual names.
*) Change: the "server_names_hash_max_size" and
"server_names_hash_bucket_size" directives.
*) Change: the "server_names_hash" and "server_names_hash_threshold"
directives were canceled.
*) Feature: the "valid_referers" directive uses the hash site names.
*) Change: now the "valid_referers" directive checks the site names
only without the URI part.
*) Bugfix: some ".domain.tld" names incorrectly processed by the
ngx_http_map_module.
*) Bugfix: segmentation fault was occurred if configuration file did
not exist; the bug had appeared in 0.3.12.
*) Bugfix: on 64-bit platforms segmentation fault may occurred on
start; the bug had appeared in 0.3.16.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/nginx.h | 2 | ||||
-rw-r--r-- | src/core/ngx_conf_file.c | 8 | ||||
-rw-r--r-- | src/core/ngx_conf_file.h | 1 | ||||
-rw-r--r-- | src/core/ngx_connection.c | 3 | ||||
-rw-r--r-- | src/core/ngx_cycle.c | 14 | ||||
-rw-r--r-- | src/core/ngx_hash.c | 272 | ||||
-rw-r--r-- | src/core/ngx_hash.h | 27 |
7 files changed, 316 insertions, 11 deletions
diff --git a/src/core/nginx.h b/src/core/nginx.h index c6c562f17..511a7c9fb 100644 --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -8,7 +8,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.3.17" +#define NGINX_VER "nginx/0.3.18" #define NGINX_VAR "NGINX" #define NGX_OLDPID_EXT ".oldbin" diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c index 377cad5bc..589eb0e00 100644 --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -78,7 +78,8 @@ ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN); if (fd == NGX_INVALID_FILE) { ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_file_n " \"%s\" failed", filename->data); + ngx_open_file_n " \"%s\" failed", + filename->data); return NGX_CONF_ERROR; } @@ -811,6 +812,11 @@ ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err, *buf = '\0'; } + if (cf->conf_file == NULL) { + ngx_log_error(level, cf->log, 0, "%s", errstr); + return; + } + ngx_log_error(level, cf->log, 0, "%s in %s:%ui", errstr, cf->conf_file->file.name.data, cf->conf_file->line); } diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h index e1859f852..62f365552 100644 --- a/src/core/ngx_conf_file.h +++ b/src/core/ngx_conf_file.h @@ -167,6 +167,7 @@ struct ngx_conf_s { ngx_cycle_t *cycle; ngx_pool_t *pool; + ngx_pool_t *temp_pool; ngx_conf_file_t *conf_file; ngx_log_t *log; diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c index 0820fede8..93b43c477 100644 --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -295,6 +295,9 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle) } } + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "bind() %V #%d ", &ls[i].addr_text, s); + if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { err = ngx_socket_errno; diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c index da4303668..e13bcd8da 100644 --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -162,6 +162,12 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) return NULL; } + conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); + if (conf.temp_pool == NULL) { + ngx_destroy_pool(pool); + return NULL; + } + conf.ctx = cycle->conf_ctx; conf.cycle = cycle; conf.pool = pool; @@ -174,6 +180,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) #endif if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) { + ngx_destroy_pool(conf.temp_pool); ngx_destroy_pool(pool); return NULL; } @@ -194,8 +201,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) if (module->init_conf) { if (module->init_conf(cycle, cycle->conf_ctx[ngx_modules[i]->index]) - == NGX_CONF_ERROR) + == NGX_CONF_ERROR) { + ngx_destroy_pool(conf.temp_pool); ngx_destroy_pool(pool); return NULL; } @@ -421,6 +429,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } if (ngx_test_config) { + ngx_destroy_pool(conf.temp_pool); ngx_destroy_pool(pool); return NULL; } @@ -438,6 +447,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } } + ngx_destroy_pool(conf.temp_pool); ngx_destroy_pool(pool); return NULL; } @@ -521,6 +531,8 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) } } + ngx_destroy_pool(conf.temp_pool); + if (old_cycle->connections == NULL) { /* an old cycle is an init cycle */ ngx_destroy_pool(old_cycle->pool); diff --git a/src/core/ngx_hash.c b/src/core/ngx_hash.c index dab19358a..f43d67533 100644 --- a/src/core/ngx_hash.c +++ b/src/core/ngx_hash.c @@ -158,7 +158,7 @@ ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts) } } - test = ngx_alloc(hinit->max_size * sizeof(ngx_uint_t), hinit->pool->log); + test = ngx_alloc(hinit->max_size * sizeof(size_t), hinit->pool->log); if (test == NULL) { return NGX_ERROR; } @@ -170,7 +170,7 @@ ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts) for (size = start; size < hinit->max_size; size++) { - ngx_memzero(test, size * sizeof(ngx_uint_t)); + ngx_memzero(test, size * sizeof(size_t)); for (n = 0; n < nelts; n++) { if (names[n].key.data == NULL) { @@ -347,7 +347,7 @@ ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts) { - size_t len; + size_t len, dot_len; ngx_uint_t i, n, dot; ngx_array_t curr_names, next_names; ngx_hash_key_t *name, *next_name; @@ -396,9 +396,11 @@ ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, #if 0 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wc1: \"%V\"", &name->key); + "wc1: \"%V\" %ui", &name->key, dot); #endif + dot_len = len + 1; + if (dot) { len++; } @@ -427,13 +429,20 @@ ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, break; } + if (!dot + && names[i].key.len > len + && names[i].key.data[len] != '.') + { + break; + } + next_name = ngx_array_push(&next_names); if (next_name == NULL) { return NGX_ERROR; } - next_name->key.len = names[i].key.len - len; - next_name->key.data = names[i].key.data + len; + next_name->key.len = names[i].key.len - dot_len; + next_name->key.data = names[i].key.data + dot_len; next_name->key_hash= 0; next_name->value = names[i].value; @@ -444,6 +453,7 @@ ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, } if (next_names.nelts) { + h = *hinit; h.hash = NULL; @@ -459,8 +469,8 @@ ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, if (names[n].key.len == len) { wdc->value = names[n].value; #if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wdc: \"%V\"", wdc->value); + ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, + "wdc: \"%V\"", wdc->value); #endif } @@ -681,3 +691,249 @@ ngx_hash0_init(ngx_hash0_t *hash, ngx_pool_t *pool, void *names, return NGX_OK; } + + +ngx_int_t +ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type) +{ + ngx_uint_t asize; + + if (type == NGX_HASH_SMALL) { + asize = 4; + ha->hsize = 107; + + } else { + asize = NGX_HASH_LARGE_ASIZE; + ha->hsize = NGX_HASH_LARGE_HSIZE; + } + + if (ngx_array_init(&ha->keys, ha->temp_pool, asize, sizeof(ngx_hash_key_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_array_init(&ha->dns_wildcards, ha->temp_pool, asize, + sizeof(ngx_hash_key_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + ha->keys_hash = ngx_pcalloc(ha->temp_pool, sizeof(ngx_array_t) * ha->hsize); + if (ha->keys_hash == NULL) { + return NGX_ERROR; + } + + ha->dns_wildcards_hash = ngx_pcalloc(ha->temp_pool, + sizeof(ngx_array_t) * ha->hsize); + if (ha->dns_wildcards_hash == NULL) { + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value, + ngx_uint_t flags) +{ + size_t len; + ngx_str_t *name; + ngx_uint_t i, k, n, skip; + ngx_hash_key_t *hk; + u_char buf[2048]; + + if (!(flags & NGX_HASH_WILDCARD_KEY)) { + + /* exact hash */ + + k = 0; + + for (i = 0; i < key->len; i++) { + key->data[i] = ngx_tolower(key->data[i]); + k = ngx_hash(k, key->data[i]); + } + + k %= ha->hsize; + + /* check conflicts in exact hash */ + + name = ha->keys_hash[k].elts; + + if (name) { + for (i = 0; i < ha->keys_hash[k].nelts; i++) { + if (key->len != name[i].len) { + continue; + } + + if (ngx_strncmp(key->data, name[i].data, key->len) == 0) { + return NGX_BUSY; + } + } + + } else { + if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4, + sizeof(ngx_str_t)) + != NGX_OK) + { + return NGX_ERROR; + } + } + + name = ngx_array_push(&ha->keys_hash[k]); + if (name == NULL) { + return NGX_ERROR; + } + + *name = *key; + + hk = ngx_array_push(&ha->keys); + if (hk == NULL) { + return NGX_ERROR; + } + + hk->key = *key; + hk->key_hash = ngx_hash_key(key->data, key->len); + hk->value = value; + + } else { + + /* wildcard hash */ + + skip = (key->data[0] == '*') ? 2 : 1; + k = 0; + + for (i = skip; i < key->len; i++) { + key->data[i] = ngx_tolower(key->data[i]); + k = ngx_hash(k, key->data[i]); + } + + k %= ha->hsize; + + if (skip == 1) { + + /* check conflicts in exact hash for ".example.com" */ + + name = ha->keys_hash[k].elts; + + if (name) { + len = key->len - skip; + + for (i = 0; i < ha->keys_hash[k].nelts; i++) { + if (len != name[i].len) { + continue; + } + + if (ngx_strncmp(&key->data[1], name[i].data, len) == 0) { + return NGX_BUSY; + } + } + + } else { + if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4, + sizeof(ngx_str_t)) + != NGX_OK) + { + return NGX_ERROR; + } + } + + name = ngx_array_push(&ha->keys_hash[k]); + if (name == NULL) { + return NGX_ERROR; + } + + name->len = key->len - 1; + name->data = ngx_palloc(ha->temp_pool, name->len); + if (name->data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(name->data, &key->data[1], name->len); + } + + + /* + * convert "*.example.com" to "com.example.\0" + * and ".example.com" to "com.example\0" + */ + + len = 0; + n = 0; + + for (i = key->len - 1; i; i--) { + if (key->data[i] == '.') { + ngx_memcpy(&buf[n], &key->data[i + 1], len); + n += len; + buf[n++] = '.'; + len = 0; + continue; + } + + len++; + } + + if (len) { + ngx_memcpy(&buf[n], &key->data[1], len); + n += len; + } + + buf[n] = '\0'; + + + /* check conflicts in wildcard hash */ + + name = ha->dns_wildcards_hash[k].elts; + + if (name) { + len = key->len - skip; + + for (i = 0; i < ha->dns_wildcards_hash[k].nelts; i++) { + if (len != name[i].len) { + continue; + } + + if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) { + return NGX_BUSY; + } + } + + } else { + if (ngx_array_init(&ha->dns_wildcards_hash[k], ha->temp_pool, 4, + sizeof(ngx_str_t)) + != NGX_OK) + { + return NGX_ERROR; + } + } + + name = ngx_array_push(&ha->dns_wildcards_hash[k]); + if (name == NULL) { + return NGX_ERROR; + } + + name->len = key->len - skip; + name->data = ngx_palloc(ha->temp_pool, name->len); + if (name->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(name->data, key->data + skip, name->len); + + + ngx_memcpy(key->data, buf, key->len); + key->len--; + + hk = ngx_array_push(&ha->dns_wildcards); + if (hk == NULL) { + return NGX_ERROR; + } + + hk->key = *key; + hk->key_hash = 0; + hk->value = value; + } + + return NGX_OK; +} diff --git a/src/core/ngx_hash.h b/src/core/ngx_hash.h index 7449d0571..855dde7c4 100644 --- a/src/core/ngx_hash.h +++ b/src/core/ngx_hash.h @@ -54,6 +54,29 @@ typedef struct { } ngx_hash_init_t; +#define NGX_HASH_SMALL 1 +#define NGX_HASH_LARGE 2 + +#define NGX_HASH_LARGE_ASIZE 16384 +#define NGX_HASH_LARGE_HSIZE 10007 + +#define NGX_HASH_WILDCARD_KEY 1 + + +typedef struct { + ngx_uint_t hsize; + + ngx_pool_t *pool; + ngx_pool_t *temp_pool; + + ngx_array_t keys; + ngx_array_t *keys_hash; + + ngx_array_t dns_wildcards; + ngx_array_t *dns_wildcards_hash; +} ngx_hash_keys_arrays_t; + + typedef struct { void **buckets; ngx_uint_t hash_size; @@ -86,6 +109,10 @@ ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t ngx_hash_key(u_char *data, size_t len); ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len); +ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type); +ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, + void *value, ngx_uint_t flags); + ngx_int_t ngx_hash0_init(ngx_hash0_t *hash, ngx_pool_t *pool, void *names, ngx_uint_t nelts); |