You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2020/07/02 00:07:04 UTC
svn commit: r1879418 - /httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
Author: ylavic
Date: Thu Jul 2 00:07:04 2020
New Revision: 1879418
URL: http://svn.apache.org/viewvc?rev=1879418&view=rev
Log:
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.
Modified:
httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1879418&r1=1879417&r2=1879418&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Thu Jul 2 00:07:04 2020
@@ -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
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);
Re: svn commit: r1879418 -
/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
Posted by Ruediger Pluem <rp...@apache.org>.
On 7/2/20 2:07 AM, ylavic@apache.org wrote:
> Author: ylavic
> Date: Thu Jul 2 00:07:04 2020
> New Revision: 1879418
>
> URL: http://svn.apache.org/viewvc?rev=1879418&view=rev
> Log:
> 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.
>
>
> Modified:
> httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1879418&r1=1879417&r2=1879418&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Thu Jul 2 00:07:04 2020
> @@ -84,15 +85,30 @@ static void proxy_wstunnel_callback(void
> 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;
What is the purpose of this?
async_pfds and tunnel_pfds are local to this block and cannot be used outside this block.
> + }
> + else {
> + baton->pfds = apr_array_copy(baton->r->pool, baton->tunnel->pfds);
> + apr_pool_create(&baton->pfds->pool, baton->r->pool);
Why first using baton->r->pool to create the copy and then setting the pool of the array to the new 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);
>
>
>
Regards
RĂ¼diger