This is an automated email from the ASF dual-hosted git repository.

cmcfarlen pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit d732af048fc250fd4b5878afe10c5594ebdde8f7
Author: Brian Neradt <[email protected]>
AuthorDate: Thu Jul 10 17:06:18 2025 -0400

    stats_over_http: ensure BrotliEncoderDestroyInstance (#12333)
    
    stats_over_http calls BrotliEncoderCreateInstance, but we weren't always
    calling BrotliEncoderDestroyInstance. This adds it to the b_stream
    destructor to ensure it gets called.
    
    (cherry picked from commit 636772a5c5ad89d19d4fcdc9a1a797228c243237)
---
 plugins/stats_over_http/stats_over_http.cc | 66 +++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 25 deletions(-)

diff --git a/plugins/stats_over_http/stats_over_http.cc 
b/plugins/stats_over_http/stats_over_http.cc
index cc20925202..6e67c80f24 100644
--- a/plugins/stats_over_http/stats_over_http.cc
+++ b/plugins/stats_over_http/stats_over_http.cc
@@ -120,33 +120,49 @@ static bool             is_ipmap_allowed(const config_t 
*config, const struct so
 
 #if HAVE_BROTLI_ENCODE_H
 struct b_stream {
-  BrotliEncoderState *br;
-  uint8_t            *next_in;
-  size_t              avail_in;
-  uint8_t            *next_out;
-  size_t              avail_out;
-  size_t              total_in;
-  size_t              total_out;
+  BrotliEncoderState *br        = nullptr;
+  uint8_t            *next_in   = nullptr;
+  size_t              avail_in  = 0;
+  uint8_t            *next_out  = nullptr;
+  size_t              avail_out = 0;
+  size_t              total_in  = 0;
+  size_t              total_out = 0;
+
+  ~b_stream()
+  {
+    if (br) {
+      BrotliEncoderDestroyInstance(br);
+      br = nullptr;
+    }
+  }
 };
 #endif
 
 struct stats_state {
-  TSVConn net_vc;
-  TSVIO   read_vio;
-  TSVIO   write_vio;
-
-  TSIOBuffer       req_buffer;
-  TSIOBuffer       resp_buffer;
-  TSIOBufferReader resp_reader;
-
-  int               output_bytes;
-  int               body_written;
-  output_format_t   output_format;
-  encoding_format_t encoding;
+  TSVConn net_vc    = nullptr;
+  TSVIO   read_vio  = nullptr;
+  TSVIO   write_vio = nullptr;
+
+  TSIOBuffer       req_buffer  = nullptr;
+  TSIOBuffer       resp_buffer = nullptr;
+  TSIOBufferReader resp_reader = nullptr;
+
+  int               output_bytes  = 0;
+  int               body_written  = 0;
+  output_format_t   output_format = output_format_t::JSON_OUTPUT;
+  encoding_format_t encoding      = encoding_format_t::NONE;
   z_stream          zstrm;
 #if HAVE_BROTLI_ENCODE_H
   b_stream bstrm;
 #endif
+  stats_state()
+  {
+    memset(&zstrm, 0, sizeof(z_stream));
+    zstrm.zalloc    = Z_NULL;
+    zstrm.zfree     = Z_NULL;
+    zstrm.opaque    = Z_NULL;
+    zstrm.data_type = Z_ASCII;
+  }
 };
 
 static char *
@@ -231,7 +247,7 @@ stats_cleanup(TSCont contp, stats_state *my_state)
   }
 
   TSVConnClose(my_state->net_vc);
-  TSfree(my_state);
+  delete my_state;
   TSContDestroy(contp);
 }
 
@@ -542,6 +558,7 @@ br_out_stats(stats_state *my_state)
   }
   my_state->output_bytes += TSIOBufferWrite(my_state->resp_buffer, outputbuf, 
outputsize);
   BrotliEncoderDestroyInstance(my_state->bstrm.br);
+  my_state->bstrm.br = nullptr;
 }
 #endif
 
@@ -726,9 +743,8 @@ stats_origin(TSCont contp, TSEvent /* event ATS_UNUSED */, 
void *edata)
   /* This is us -- register our intercept */
   Dbg(dbg_ctl, "Intercepting request");
 
-  my_state = (stats_state *)TSmalloc(sizeof(*my_state));
-  memset(my_state, 0, sizeof(*my_state));
-  icontp = TSContCreate(stats_dostuff, TSMutexCreate());
+  my_state = new stats_state;
+  icontp   = TSContCreate(stats_dostuff, TSMutexCreate());
 
   if (path_had_explicit_format) {
     Dbg(dbg_ctl, "Path had explicit format, ignoring any Accept header: %s", 
request_path_suffix.data());
@@ -916,7 +932,7 @@ static config_t *
 new_config(std::fstream &fh)
 {
   config_t *config    = nullptr;
-  config              = new config_t();
+  config              = new config_t;
   config->recordTypes = DEFAULT_RECORD_TYPES;
   config->stats_path  = "";
   std::string cur_line;
@@ -968,7 +984,7 @@ static void
 delete_config(config_t *config)
 {
   Dbg(dbg_ctl, "Freeing config");
-  TSfree(config);
+  delete config;
 }
 
 // standard api below...

Reply via email to