Closed dkimitsa closed 2 months ago
The issue description says "making multiple request to same host/port", I assume this actually means multiple connections?
Does this affect all application code, or is it only triggered if this caching mechanism is explicitly enabled in some way?
Without this patch, is it possible to work around the issue from application code?
@guillerodriguez yes its about opening multiple https/tls connections to same host/port. sadly it is happening unconditionally.
few cents about investigation https://dkimitsa.github.io/2024/05/08/fix-memory-corruption-due-http-requests/
Context
making multiple request to same host/port cause some of them terminated with message
(or application crashed random places)
root case
Reusing same Session cause same native SSL_Session to be used with each opened OpenSSLSocketImpl. It associates it's native pointer with its SSL.
As result multiple OpenSSLSocketImpl and its SSL will use same single session. Problem appear once this socked is being closed, as it destroys SSL by calling
NativeCrypto.SSL_free(sslNativePointer);
and SSL under hood destroys all elements it contains, and shared session as result.This cause single object to be multiple times released, released memory is used as valid -- this causes logic errors as described above and SIGABRT crashes.
The "fix"
Properly fixing session sharing on Android 4.4.x code base is problematic as things are not implemented this way. In recent version of Libcore its handled completely different way. The way to prevent apps from crashing is to disable the feature. it will introduce longer TLS handshake.
RoboVMx experimental port is not affected by this issue.