summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-07-02 15:41:31 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-07-02 15:41:31 +0000
commit0b233916868a659a5edf5bbb625d9defa53e475c (patch)
treea2bfffebee1bbf011e6301def90ef08e65ebb7a6
parent049447b2670b5a133a3c7a3ff3fa1f11095a1b72 (diff)
downloadnginx-0b233916868a659a5edf5bbb625d9defa53e475c.tar.gz
nginx-0b233916868a659a5edf5bbb625d9defa53e475c.tar.bz2
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Patch by Denis F. Latypoff (slightly modified).
-rw-r--r--src/http/modules/ngx_http_geoip_module.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/http/modules/ngx_http_geoip_module.c b/src/http/modules/ngx_http_geoip_module.c
index abc79cdfe..0ce3bf1e5 100644
--- a/src/http/modules/ngx_http_geoip_module.c
+++ b/src/http/modules/ngx_http_geoip_module.c
@@ -28,7 +28,7 @@ typedef struct {
} ngx_http_geoip_var_t;
-typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr);
+typedef char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr);
static u_long ngx_http_geoip_addr(ngx_http_request_t *r,
ngx_http_geoip_conf_t *gcf);
@@ -291,7 +291,8 @@ ngx_http_geoip_org_variable(ngx_http_request_t *r,
ngx_http_geoip_variable_handler_pt handler =
(ngx_http_geoip_variable_handler_pt) data;
- const char *val;
+ size_t len;
+ char *val;
ngx_http_geoip_conf_t *gcf;
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
@@ -306,11 +307,21 @@ ngx_http_geoip_org_variable(ngx_http_request_t *r,
goto not_found;
}
- v->len = ngx_strlen(val);
+ len = ngx_strlen(val);
+ v->data = ngx_pnalloc(r->pool, len);
+ if (v->data == NULL) {
+ ngx_free(val);
+ return NGX_ERROR;
+ }
+
+ ngx_memcpy(v->data, val, len);
+
+ v->len = len;
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
- v->data = (u_char *) val;
+
+ ngx_free(val);
return NGX_OK;