]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_proxy_wstunnel: avoid leaks on tunnel->pfds->pool.
authorYann Ylavic <ylavic@apache.org>
Thu, 2 Jul 2020 00:07:04 +0000 (00:07 +0000)
committerYann Ylavic <ylavic@apache.org>
Thu, 2 Jul 2020 00:07:04 +0000 (00:07 +0000)
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

modules/proxy/mod_proxy_wstunnel.c

index 75ac8e69eb7ed655a1cb40eb3f40b3acaffabad7..6cf2d37bc31262b47fd30e10555606801f996729 100644 (file)
@@ -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);