summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@nginx.com>2018-02-21 15:50:42 +0300
committerRuslan Ermilov <ru@nginx.com>2018-02-21 15:50:42 +0300
commitf98a8c4db622223485ad5f175c79ecc0695ed5cc (patch)
tree8523840f9bca1166a2291c100071a4eb01ba775f
parent864d93965b58495c0e14df1b4a0d1647a4a28aff (diff)
downloadnginx-f98a8c4db622223485ad5f175c79ecc0695ed5cc.tar.gz
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.
-rw-r--r--src/http/modules/ngx_http_geo_module.c27
-rw-r--r--src/stream/ngx_stream_geo_module.c27
2 files changed, 32 insertions, 22 deletions
diff --git a/src/http/modules/ngx_http_geo_module.c b/src/http/modules/ngx_http_geo_module.c
index 8262c9d61..9102c987d 100644
--- a/src/http/modules/ngx_http_geo_module.c
+++ b/src/http/modules/ngx_http_geo_module.c
@@ -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);
if (ctx.temp_pool == NULL) {
+ ngx_destroy_pool(pool);
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 *));
if (ctx.high.low[i] == NULL) {
- return NGX_CONF_ERROR;
+ goto failed;
}
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->data = (uintptr_t) geo;
- ngx_destroy_pool(ctx.temp_pool);
- ngx_destroy_pool(pool);
-
} else {
if (ctx.tree == NULL) {
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
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) {
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
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->data = (uintptr_t) geo;
- ngx_destroy_pool(ctx.temp_pool);
- ngx_destroy_pool(pool);
-
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
(uintptr_t) &ngx_http_variable_null_value)
== NGX_ERROR)
{
- return NGX_CONF_ERROR;
+ goto failed;
}
/* 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)
== NGX_ERROR)
{
- return NGX_CONF_ERROR;
+ goto failed;
}
#endif
}
+ ngx_destroy_pool(ctx.temp_pool);
+ ngx_destroy_pool(pool);
+
return rv;
+
+failed:
+
+ ngx_destroy_pool(ctx.temp_pool);
+ ngx_destroy_pool(pool);
+
+ return NGX_CONF_ERROR;
}
diff --git a/src/stream/ngx_stream_geo_module.c b/src/stream/ngx_stream_geo_module.c
index 632fa5a5a..6b69d9bba 100644
--- a/src/stream/ngx_stream_geo_module.c
+++ b/src/stream/ngx_stream_geo_module.c
@@ -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);
if (ctx.temp_pool == NULL) {
+ ngx_destroy_pool(pool);
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 *));
if (ctx.high.low[i] == NULL) {
- return NGX_CONF_ERROR;
+ goto failed;
}
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->data = (uintptr_t) geo;
- ngx_destroy_pool(ctx.temp_pool);
- ngx_destroy_pool(pool);
-
} else {
if (ctx.tree == NULL) {
ctx.tree = ngx_radix_tree_create(cf->pool, -1);
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) {
ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
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->data = (uintptr_t) geo;
- ngx_destroy_pool(ctx.temp_pool);
- ngx_destroy_pool(pool);
-
if (ngx_radix32tree_insert(ctx.tree, 0, 0,
(uintptr_t) &ngx_stream_variable_null_value)
== NGX_ERROR)
{
- return NGX_CONF_ERROR;
+ goto failed;
}
/* 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)
== NGX_ERROR)
{
- return NGX_CONF_ERROR;
+ goto failed;
}
#endif
}
+ ngx_destroy_pool(ctx.temp_pool);
+ ngx_destroy_pool(pool);
+
return rv;
+
+failed:
+
+ ngx_destroy_pool(ctx.temp_pool);
+ ngx_destroy_pool(pool);
+
+ return NGX_CONF_ERROR;
}