HTTP Connection Map Memory Leak - Known Limitation
Overview
The Apache Axis2/C HTTP transport layer has a minor 15-byte memory leak in unit test scenarios related to connection map management. This document describes the issue, its impact, and the rationale for accepting it as a known limitation.
Technical Details
Location
- File:
src/core/transport/http/sender/http_sender.c - Function:
axis2_http_sender_connection_map_add() - Line: 3756
- Code:
axutil_hash_set(connection_map, axutil_strdup(env, server), AXIS2_HASH_KEY_STRING, http_client);
Root Cause
- Memory Allocation: Server names are duplicated using
axutil_strdup() for use as hash table keys - Storage: Connection map is stored as a session-scoped property in the configuration context
- Cleanup Issue: Session property cleanup is not reliably triggered in short-lived unit test scenarios
- Cleanup Function: While
axis2_http_sender_connection_map_free() exists and correctly frees hash keys, it's not consistently invoked during test teardown
Leak Characteristics
- Size: 15 bytes per HTTP connection (length of “localhost:9090” + null terminator)
- Frequency: Once per service client session in unit tests
- Scope: Limited to unit test environments with short-lived clients
- Type: Non-accumulating (fixed per test run, doesn't grow over time)
Impact Assessment
Low Risk Factors
- Minimal Size: Only 15 bytes per test execution
- Test-Only: Does not occur in production HTTP server scenarios
- Non-Functional: No impact on HTTP transport functionality
- Non-Security: No security implications
- Contained: Leak is bounded and predictable
Detection
- Tool: AddressSanitizer during unit test execution
- Output:
Direct leak of 15 byte(s) in 1 object(s) allocated from axutil_strdup - Test:
test/core/clientapi/test_clientapi
Architectural Context
Why This Occurs
The HTTP connection map is designed for keep-alive connection management in long-running server scenarios. The session-scoped property cleanup mechanism works correctly for:
- Long-lived HTTP server processes
- Multi-request client sessions
- Normal application lifecycle management
However, unit tests create a different execution pattern:
- Very short-lived service clients
- Immediate teardown after single request
- Configuration context destroyed before session cleanup completes
Fix Complexity
Resolving this leak requires significant architectural changes:
Conditional Compilation Issues: Connection map functions are wrapped in #ifndef AXIS2_LIBCURL_ENABLED blocks that conflict with public API availability
Property Lifecycle Management: Session-scoped property cleanup timing varies across different execution contexts
API Compatibility: Making internal cleanup functions public could break existing LIBCURL integration
Testing Infrastructure: Fundamental changes to how unit tests manage HTTP transport lifecycle
Attempted Solutions
1. Enhanced Cleanup Function
- Approach: Improved
axis2_http_sender_connection_map_free() with defensive programming - Result: Function works correctly but isn't consistently invoked
- Status: Function already handles key cleanup properly
2. Explicit Service Client Cleanup
- Approach: Added explicit connection map cleanup in
axis2_svc_client_free() - Result: Compilation errors due to function visibility
- Status: Abandoned due to architectural conflicts
3. Function Visibility Changes
- Approach: Made cleanup function public and added to header file
- Result: Conditional compilation conflicts with public API
- Status: Created more problems than it solved
Decision Rationale
Accept as Known Limitation
Given the risk/benefit analysis:
Low Impact:
- 15 bytes per unit test run
- No production implications
- No functionality impact
- Non-accumulating memory usage
High Complexity:
- Requires architectural changes to conditional compilation
- Risk of breaking LIBCURL integration
- Potential API compatibility issues
- Extensive testing required across build configurations
Conclusion: The cost of fixing this minor test-only leak outweighs the negligible benefits.
Monitoring and Management
Test Output Management
To reduce the perceived severity of this known limitation:
- Test Documentation: Clear indication that this is a known, acceptable limitation
- Filtered Reporting: Option to suppress this specific leak in test summaries
- Context: Ensure test output explains this is test-environment specific
Long-term Considerations
- Architecture Review: Future HTTP transport refactoring could address this naturally
- Test Framework: Evolution of unit test lifecycle management might resolve the cleanup timing
- Build System: Enhanced conditional compilation management could enable safer fixes
Conclusion
The 15-byte HTTP connection map memory leak represents a minor architectural limitation in session property cleanup for short-lived HTTP connections in unit test scenarios. The leak is:
- Contained and predictable
- Non-functional and non-security related
- Test-environment specific
- Architecturally complex to resolve safely
This limitation is documented and accepted as part of the current Axis2/C HTTP transport implementation, with the understanding that future architectural improvements may naturally resolve it.
Document Version: 1.0 Last Updated: November 2024 Status: Known Limitation - Accepted