]> git.kaiwu.me - nginx.git/commitdiff
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 2 Jul 2012 15:41:31 +0000 (15:41 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 2 Jul 2012 15:41:31 +0000 (15:41 +0000)
Patch by Denis F. Latypoff (slightly modified).

src/http/modules/ngx_http_geoip_module.c

index abc79cdfeeb42cedd17508c069d20e783452ec69..0ce3bf1e59b6d24526c9ce68b3a7ada33ee63232 100644 (file)
@@ -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;