aboutsummaryrefslogtreecommitdiff
path: root/src/stream/ngx_stream_geo_module.c
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 /src/stream/ngx_stream_geo_module.c
parent864d93965b58495c0e14df1b4a0d1647a4a28aff (diff)
downloadnginx-f98a8c4db622223485ad5f175c79ecc0695ed5cc.tar.gz
nginx-f98a8c4db622223485ad5f175c79ecc0695ed5cc.zip
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.
Diffstat (limited to 'src/stream/ngx_stream_geo_module.c')
-rw-r--r--src/stream/ngx_stream_geo_module.c27
1 files changed, 16 insertions, 11 deletions
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;
}