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

robertlazarski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/axis-axis2-c-core.git

commit 74ca7e9c34c63f8072fd996a82accff5ca8f093b
Author: Robert Lazarski <[email protected]>
AuthorDate: Sat Jan 10 09:20:11 2026 -1000

    Fix memory leaks when server returns error (AXIS2C-1214)
    
    Fix engine and fault message context memory leaks in error handling paths:
    
    1. svr_callback.c: axis2_svr_callback_handle_result() was not freeing the
       engine after use. axis2_svr_callback_handle_fault() was not freeing
       either the engine or the fault_ctx message context.
    
    2. http_transport_utils.c: In axis2_http_transport_utils_process_request(),
       when processing fails and a SOAP fault is generated, both engine and
       fault_ctx were created but never freed.
    
    3. apache2_worker.c: Same issue in axis2_apache2_worker_process_request()
       error handling path - engine and fault_ctx were not freed.
    
    These leaks occurred whenever the server returned an error response,
    as reported in the original Jira issue.
    
    Co-Authored-By: Claude Opus 4.5 <[email protected]>
---
 src/core/receivers/svr_callback.c                       | 16 ++++++++++++++--
 src/core/transport/http/server/apache2/apache2_worker.c |  5 +++++
 src/core/transport/http/util/http_transport_utils.c     |  5 +++++
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/core/receivers/svr_callback.c 
b/src/core/receivers/svr_callback.c
index 2fe68b1b6..803194e4b 100644
--- a/src/core/receivers/svr_callback.c
+++ b/src/core/receivers/svr_callback.c
@@ -80,7 +80,11 @@ axis2_svr_callback_handle_result(
     {
         return AXIS2_FAILURE;
     }
-    return axis2_engine_send(engine, env, msg_ctx);
+    {
+        axis2_status_t status = axis2_engine_send(engine, env, msg_ctx);
+        axis2_engine_free(engine, env);
+        return status;
+    }
 }
 
 AXIS2_EXPORT axis2_status_t AXIS2_CALL
@@ -108,5 +112,13 @@ axis2_svr_callback_handle_fault(
     }
 
     fault_ctx = axis2_engine_create_fault_msg_ctx(engine, env, msg_ctx, NULL, 
NULL);
-    return axis2_engine_send_fault(engine, env, fault_ctx);
+    {
+        axis2_status_t status = axis2_engine_send_fault(engine, env, 
fault_ctx);
+        if(fault_ctx)
+        {
+            axis2_msg_ctx_free(fault_ctx, env);
+        }
+        axis2_engine_free(engine, env);
+        return status;
+    }
 }
diff --git a/src/core/transport/http/server/apache2/apache2_worker.c 
b/src/core/transport/http/server/apache2/apache2_worker.c
index 94e4adc8b..eafc4b752 100644
--- a/src/core/transport/http/server/apache2/apache2_worker.c
+++ b/src/core/transport/http/server/apache2/apache2_worker.c
@@ -945,6 +945,11 @@ axis2_apache2_worker_process_request(
                 axutil_error_get_message
                 (env->error));
             axis2_engine_send_fault(engine, env, fault_ctx);
+            if(fault_ctx)
+            {
+                axis2_msg_ctx_free(fault_ctx, env);
+            }
+            axis2_engine_free(engine, env);
             if (out_stream)
             {
                 body_string = axutil_stream_get_buffer(out_stream, env);
diff --git a/src/core/transport/http/util/http_transport_utils.c 
b/src/core/transport/http/util/http_transport_utils.c
index db2bf689f..670f54a31 100644
--- a/src/core/transport/http/util/http_transport_utils.c
+++ b/src/core/transport/http/util/http_transport_utils.c
@@ -3219,6 +3219,11 @@ axis2_http_transport_utils_process_request(
                 fault_code, axutil_error_get_message(env->error));
 
             axis2_engine_send_fault(engine, env, fault_ctx);
+            if(fault_ctx)
+            {
+                axis2_msg_ctx_free(fault_ctx, env);
+            }
+            axis2_engine_free(engine, env);
             if (out_stream)
             {
                 response->response_data = axutil_stream_get_buffer(out_stream, 
env);

Reply via email to