From: Yann Ylavic Date: Thu, 2 Jul 2020 00:07:04 +0000 (+0000) Subject: mod_proxy_wstunnel: avoid leaks on tunnel->pfds->pool. X-Git-Tag: 2.5.0-alpha2-ci-test-only~1302 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29bcc0eaa3ffd4ca419d831d8c5ba57f58229bf2;p=thirdparty%2Fapache%2Fhttpd.git mod_proxy_wstunnel: avoid leaks on tunnel->pfds->pool. Since event_register_poll_callback_ex() allocates its data on pfds->pool, we need a subpool to be cleared at each proxy_wstunnel_callback() call. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1879418 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy_wstunnel.c b/modules/proxy/mod_proxy_wstunnel.c index 75ac8e69eb7..6cf2d37bc31 100644 --- a/modules/proxy/mod_proxy_wstunnel.c +++ b/modules/proxy/mod_proxy_wstunnel.c @@ -29,6 +29,7 @@ typedef struct ws_baton_t { request_rec *r; proxy_conn_rec *backend; proxy_tunnel_rec *tunnel; + apr_array_header_t *pfds; const char *scheme; } ws_baton_t; @@ -84,15 +85,30 @@ static void proxy_wstunnel_callback(void *b) ws_baton_t *baton = (ws_baton_t*)b; proxyws_dir_conf *dconf = ap_get_module_config(baton->r->per_dir_config, &proxy_wstunnel_module); - int status = proxy_wstunnel_pump(baton, 1); - if (status == SUSPENDED) { - ap_mpm_register_poll_callback_timeout(baton->tunnel->pfds, - proxy_wstunnel_callback, - proxy_wstunnel_cancel_callback, - baton, - dconf->idle_timeout); + + if (baton->pfds) { + apr_pool_clear(baton->pfds->pool); + } + + if (proxy_wstunnel_pump(baton, 1) == SUSPENDED) { ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, baton->r, "proxy_wstunnel_callback suspend"); + + if (baton->pfds) { + apr_pollfd_t *async_pfds = (void *)baton->pfds->elts; + apr_pollfd_t *tunnel_pfds = (void *)baton->tunnel->pfds->elts; + async_pfds[0].reqevents = tunnel_pfds[0].reqevents; + async_pfds[1].reqevents = tunnel_pfds[1].reqevents; + } + else { + baton->pfds = apr_array_copy(baton->r->pool, baton->tunnel->pfds); + apr_pool_create(&baton->pfds->pool, baton->r->pool); + } + + ap_mpm_register_poll_callback_timeout(baton->pfds, + proxy_wstunnel_callback, + proxy_wstunnel_cancel_callback, + baton, dconf->idle_timeout); } else { proxy_wstunnel_finish(baton);