]> git.kaiwu.me - nginx.git/commitdiff
fix memory leak if GeoIP City database was used
authorIgor Sysoev <igor@sysoev.ru>
Wed, 19 Aug 2009 17:44:33 +0000 (17:44 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 19 Aug 2009 17:44:33 +0000 (17:44 +0000)
src/http/modules/ngx_http_geoip_module.c

index 2d3fe20f269ce33dd9c84220a60d9e4aa0c0cd57..81b872efb62109262fc00eda44c716cdeaec7302 100644 (file)
@@ -181,6 +181,7 @@ ngx_http_geoip_city_variable(ngx_http_request_t *r,
 {
     u_long                  addr;
     char                   *val;
+    size_t                  len;
     GeoIPRecord            *gr;
     struct sockaddr_in     *sin;
     ngx_http_geoip_conf_t  *gcf;
@@ -207,17 +208,32 @@ ngx_http_geoip_city_variable(ngx_http_request_t *r,
     val = *(char **) ((char *) gr + data);
 
     if (val == NULL) {
-        goto not_found;
+        goto no_value;
     }
 
-    v->len = ngx_strlen(val);
+    len = ngx_strlen(val);
+    v->data = ngx_pnalloc(r->pool, len);
+
+    if (v->data == NULL) {
+        GeoIPRecord_delete(gr);
+        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;
+
+    GeoIPRecord_delete(gr);
 
     return NGX_OK;
 
+no_value:
+
+    GeoIPRecord_delete(gr);
+
 not_found:
 
     v->not_found = 1;