mirror of
https://github.com/nginx/nginx.git
synced 2025-06-08 02:02:38 +08:00
Geo: fixed memory allocation error handling (closes #1482).
If during configuration parsing of the geo directive the memory allocation has failed, pool used to parse configuration inside the block, and sometimes the temporary pool were not destroyed.
This commit is contained in:
parent
864d93965b
commit
f98a8c4db6
@ -439,6 +439,7 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
|
|
||||||
ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
|
ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
|
||||||
if (ctx.temp_pool == NULL) {
|
if (ctx.temp_pool == NULL) {
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,7 +483,7 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
|
|
||||||
ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));
|
ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));
|
||||||
if (ctx.high.low[i] == NULL) {
|
if (ctx.high.low[i] == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(ctx.high.low[i], a->elts, len);
|
ngx_memcpy(ctx.high.low[i], a->elts, len);
|
||||||
@ -508,14 +509,11 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
var->get_handler = ngx_http_geo_range_variable;
|
var->get_handler = ngx_http_geo_range_variable;
|
||||||
var->data = (uintptr_t) geo;
|
var->data = (uintptr_t) geo;
|
||||||
|
|
||||||
ngx_destroy_pool(ctx.temp_pool);
|
|
||||||
ngx_destroy_pool(pool);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (ctx.tree == NULL) {
|
if (ctx.tree == NULL) {
|
||||||
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
|
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
|
||||||
if (ctx.tree == NULL) {
|
if (ctx.tree == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +523,7 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
if (ctx.tree6 == NULL) {
|
if (ctx.tree6 == NULL) {
|
||||||
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
|
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
|
||||||
if (ctx.tree6 == NULL) {
|
if (ctx.tree6 == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,14 +533,11 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
var->get_handler = ngx_http_geo_cidr_variable;
|
var->get_handler = ngx_http_geo_cidr_variable;
|
||||||
var->data = (uintptr_t) geo;
|
var->data = (uintptr_t) geo;
|
||||||
|
|
||||||
ngx_destroy_pool(ctx.temp_pool);
|
|
||||||
ngx_destroy_pool(pool);
|
|
||||||
|
|
||||||
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
|
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
|
||||||
(uintptr_t) &ngx_http_variable_null_value)
|
(uintptr_t) &ngx_http_variable_null_value)
|
||||||
== NGX_ERROR)
|
== NGX_ERROR)
|
||||||
{
|
{
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NGX_BUSY is okay (default was set explicitly) */
|
/* NGX_BUSY is okay (default was set explicitly) */
|
||||||
@ -552,12 +547,22 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
(uintptr_t) &ngx_http_variable_null_value)
|
(uintptr_t) &ngx_http_variable_null_value)
|
||||||
== NGX_ERROR)
|
== NGX_ERROR)
|
||||||
{
|
{
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_destroy_pool(ctx.temp_pool);
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
|
||||||
|
ngx_destroy_pool(ctx.temp_pool);
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
|
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -409,6 +409,7 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
|
|
||||||
ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
|
ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
|
||||||
if (ctx.temp_pool == NULL) {
|
if (ctx.temp_pool == NULL) {
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,7 +450,7 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
|
|
||||||
ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));
|
ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));
|
||||||
if (ctx.high.low[i] == NULL) {
|
if (ctx.high.low[i] == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_memcpy(ctx.high.low[i], a->elts, len);
|
ngx_memcpy(ctx.high.low[i], a->elts, len);
|
||||||
@ -475,14 +476,11 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
var->get_handler = ngx_stream_geo_range_variable;
|
var->get_handler = ngx_stream_geo_range_variable;
|
||||||
var->data = (uintptr_t) geo;
|
var->data = (uintptr_t) geo;
|
||||||
|
|
||||||
ngx_destroy_pool(ctx.temp_pool);
|
|
||||||
ngx_destroy_pool(pool);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (ctx.tree == NULL) {
|
if (ctx.tree == NULL) {
|
||||||
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
|
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
|
||||||
if (ctx.tree == NULL) {
|
if (ctx.tree == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -492,7 +490,7 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
if (ctx.tree6 == NULL) {
|
if (ctx.tree6 == NULL) {
|
||||||
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
|
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
|
||||||
if (ctx.tree6 == NULL) {
|
if (ctx.tree6 == NULL) {
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,14 +500,11 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
var->get_handler = ngx_stream_geo_cidr_variable;
|
var->get_handler = ngx_stream_geo_cidr_variable;
|
||||||
var->data = (uintptr_t) geo;
|
var->data = (uintptr_t) geo;
|
||||||
|
|
||||||
ngx_destroy_pool(ctx.temp_pool);
|
|
||||||
ngx_destroy_pool(pool);
|
|
||||||
|
|
||||||
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
|
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
|
||||||
(uintptr_t) &ngx_stream_variable_null_value)
|
(uintptr_t) &ngx_stream_variable_null_value)
|
||||||
== NGX_ERROR)
|
== NGX_ERROR)
|
||||||
{
|
{
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NGX_BUSY is okay (default was set explicitly) */
|
/* NGX_BUSY is okay (default was set explicitly) */
|
||||||
@ -519,12 +514,22 @@ ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
(uintptr_t) &ngx_stream_variable_null_value)
|
(uintptr_t) &ngx_stream_variable_null_value)
|
||||||
== NGX_ERROR)
|
== NGX_ERROR)
|
||||||
{
|
{
|
||||||
return NGX_CONF_ERROR;
|
goto failed;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_destroy_pool(ctx.temp_pool);
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
|
||||||
|
ngx_destroy_pool(ctx.temp_pool);
|
||||||
|
ngx_destroy_pool(pool);
|
||||||
|
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user