mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-12 23:40:04 +00:00
Sofia will unpredictably close a tls transport during call setup. This occurs when the epoll event loop wakes up the socket reader and SSL_read returns an error because there is no packet on the socket. Normally sofia will read the last error using SSL_get_error and return SSL_ERROR_WANT_READ. Sofia gracefully handles this error and the transport stays open. Sometimes, however, the worker thread will call SSL_shutdown for a different transport, which can write an error to the internal openssl error queue. If that error is not read off the queue, the next time that SSL_get_error is called, it will read that unrelated error. The documentation for SSL_shutdown explains that there are three possible results -1, 0 and 1 with, oddly, 1 indicating success. The -1 result code occurs when there is no handshake callback registered on the connection. It can return 0 when there is still work to be done. The documentation suggest that it is insufficient to call it just once. This is why I added the do {} while () construct. Although just the fix to SSL_shutdown was enough to resolve my issue, I a also audited other calls to SSL_* functions and found a few other cases where an error may be generated, but was not handled.
Description
FreeSWITCH is a Software Defined Telecom Stack enabling the digital transformation from proprietary telecom switches to a versatile software implementation that runs on any commodity hardware. From a Raspberry PI to a multi-core server, FreeSWITCH can unl
Multiple Licenses
196 MiB
Languages
C
65.2%
C++
20.8%
JavaScript
4.8%
Assembly
2%
Makefile
1%
Other
5.4%