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);
