diff --git a/src/ngx_http_lua_socket_tcp.c b/src/ngx_http_lua_socket_tcp.c index 1f564ac129..7193b91035 100644 --- a/src/ngx_http_lua_socket_tcp.c +++ b/src/ngx_http_lua_socket_tcp.c @@ -645,7 +645,11 @@ ngx_http_lua_socket_tcp_connect_helper(lua_State *L, } /* end spool != NULL */ - host.data = ngx_palloc(r->pool, host_len + 1); + if (!u->pool) { + u->pool = ngx_create_pool(128, r->connection->log); + } + + host.data = ngx_palloc(u->pool, host_len + 1); if (host.data == NULL) { return luaL_error(L, "no memory"); } @@ -662,7 +666,7 @@ ngx_http_lua_socket_tcp_connect_helper(lua_State *L, coctx = ctx->cur_co_ctx; - if (ngx_parse_url(r->pool, &url) != NGX_OK) { + if (ngx_parse_url(u->pool, &url) != NGX_OK) { lua_pushnil(L); if (url.err) { @@ -680,7 +684,7 @@ ngx_http_lua_socket_tcp_connect_helper(lua_State *L, ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua tcp socket connect timeout: %M", u->connect_timeout); - u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); + u->resolved = ngx_pcalloc(u->pool, sizeof(ngx_http_upstream_resolved_t)); if (u->resolved == NULL) { if (resuming) { lua_pushnil(L); @@ -1221,7 +1225,7 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx) socklen = ur->addrs[i].socklen; - sockaddr = ngx_palloc(r->pool, socklen); + sockaddr = ngx_palloc(u->pool, socklen); if (sockaddr == NULL) { goto nomem; } @@ -4171,15 +4175,24 @@ ngx_http_lua_socket_tcp_finalize(ngx_http_request_t *r, return; } - if (u->resolved && u->resolved->ctx) { - ngx_resolve_name_done(u->resolved->ctx); - u->resolved->ctx = NULL; + if (u->resolved) { + if (u->resolved->ctx) { + ngx_resolve_name_done(u->resolved->ctx); + u->resolved->ctx = NULL; + } + + u->resolved = NULL; } if (u->peer.free) { u->peer.free(&u->peer, u->peer.data, 0); } + if (u->pool) { + ngx_destroy_pool(u->pool); + u->pool = NULL; + } + #if (NGX_HTTP_SSL) if (u->ssl_name.data) { ngx_free(u->ssl_name.data); @@ -6101,6 +6114,11 @@ ngx_http_lua_tcp_resolve_cleanup(void *data) } rctx = u->resolved->ctx; + if (u->pool) { + ngx_destroy_pool(u->pool); + u->pool = NULL; + } + if (rctx == NULL) { return; } diff --git a/src/ngx_http_lua_socket_tcp.h b/src/ngx_http_lua_socket_tcp.h index ee9411bc8d..bd75d38035 100644 --- a/src/ngx_http_lua_socket_tcp.h +++ b/src/ngx_http_lua_socket_tcp.h @@ -91,6 +91,7 @@ struct ngx_http_lua_socket_tcp_upstream_s { ngx_http_cleanup_pt *cleanup; ngx_http_request_t *request; ngx_peer_connection_t peer; + ngx_pool_t *pool; ngx_msec_t read_timeout; ngx_msec_t send_timeout;