[ 
https://issues.apache.org/jira/browse/THRIFT-2936?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James E. King, III reopened THRIFT-2936:
----------------------------------------

I've found that this causes a crash similar to the one described here:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=462780

I had to remove it in order not to crash in any application that opens one 
socket at a time then closes everything, such as a set of unit tests.
The stack I get is:
{noformat}
==11727== Invalid read of size 8
==11727==    at 0x5E0D539: sk_free (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==11727==    by 0x66BED1D: apache::thrift::transport::cleanupOpenSSL() 
(TSSLSocket.cpp:127)
==11727==    by 0x66C32B7: 
apache::thrift::transport::TSSLSocketFactory::~TSSLSocketFactory() 
(TSSLSocket.cpp:469)
==11727==    by 0x4D665A4: 
TLSOnlyTSSLServerSocketFactory::~TLSOnlyTSSLServerSocketFactory() (in 
/var/tmp/build/lib/libcommon.so)
==11727==    by 0x4D665C8: 
TLSOnlyTSSLServerSocketFactory::~TLSOnlyTSSLServerSocketFactory() 
(rpctlsserver.cpp:25)
==11727==    by 0x4D6698A: void 
boost::checked_delete<TLSOnlyTSSLServerSocketFactory>(TLSOnlyTSSLServerSocketFactory*)
 (checked_delete.hpp:34)
==11727==    by 0x4D66A08: 
boost::detail::sp_counted_impl_p<TLSOnlyTSSLServerSocketFactory>::dispose() 
(sp_counted_impl.hpp:78)
==11727==    by 0x44A808: boost::detail::sp_counted_base::release() 
(sp_counted_base_clang.hpp:112)
==11727==    by 0x44A7A9: boost::detail::shared_count::~shared_count() 
(shared_count.hpp:467)
==11727==    by 0x4D664C8: 
boost::shared_ptr<apache::thrift::transport::TSSLSocketFactory>::~shared_ptr() 
(in /var/tmp/build/lib/libcommon.so)
==11727==    by 0x4D65725: RpcTlsServer::getSSLSocketFactory() 
(rpctlsserver.cpp:79)
==11727==    by 0x4D65939: RpcTlsServer::start() (rpctlsserver.cpp:92)
==11727==  Address 0xaa27858 is 8 bytes inside a block of size 32 free'd
==11727==    at 0x402E36D: free (vg_replace_malloc.c:473)
==11727==    by 0x5D87F8C: CRYPTO_free (in 
/lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==11727==    by 0x66BED1D: apache::thrift::transport::cleanupOpenSSL() 
(TSSLSocket.cpp:127)
==11727==    by 0x66C32B7: 
apache::thrift::transport::TSSLSocketFactory::~TSSLSocketFactory() 
(TSSLSocket.cpp:469)
==11727==    by 0x4D665A4: 
TLSOnlyTSSLServerSocketFactory::~TLSOnlyTSSLServerSocketFactory() (in 
/var/tmp/build/lib/libcommon.so)
==11727==    by 0x4D665C8: 
TLSOnlyTSSLServerSocketFactory::~TLSOnlyTSSLServerSocketFactory() 
(rpctlsserver.cpp:25)
==11727==    by 0x4D6698A: void 
boost::checked_delete<TLSOnlyTSSLServerSocketFactory>(TLSOnlyTSSLServerSocketFactory*)
 (checked_delete.hpp:34)
==11727==    by 0x4D66A08: 
boost::detail::sp_counted_impl_p<TLSOnlyTSSLServerSocketFactory>::dispose() 
(sp_counted_impl.hpp:78)
==11727==    by 0x44A808: boost::detail::sp_counted_base::release() 
(sp_counted_base_clang.hpp:112)
==11727==    by 0x44A7A9: boost::detail::shared_count::~shared_count() 
(shared_count.hpp:467)
==11727==    by 0x4D664C8: 
boost::shared_ptr<apache::thrift::transport::TSSLSocketFactory>::~shared_ptr() 
(in /var/tmp/build/lib/libcommon.so)
==11727==    by 0x4D65725: RpcTlsServer::getSSLSocketFactory() 
(rpctlsserver.cpp:79)
{noformat}

As such, we should consider backing this change out.
The following "cleanupOpenSSL" works for me:
{noformat}
void cleanupOpenSSL() {
  if (!openSSLInitialized) {
    return;
  }
  openSSLInitialized = false;
#if (OPENSSL_VERSION_NUMBER < OPENSSL_VERSION_NO_THREAD_ID)
  CRYPTO_set_id_callback(NULL);
#endif
  CRYPTO_set_locking_callback(NULL);
  CRYPTO_set_dynlock_create_callback(NULL);
  CRYPTO_set_dynlock_lock_callback(NULL);
  CRYPTO_set_dynlock_destroy_callback(NULL);
  ERR_free_strings();
  EVP_cleanup();
  CRYPTO_cleanup_all_ex_data();
  ERR_remove_state(0);
  mutexes.reset();
}
{noformat}

I reordered the sequence of where CRYPTO_cleanup_all_ex_data is called based on 
the eclipse bug report's resolution of the same issue.

> Minor memory leak in SSL
> ------------------------
>
>                 Key: THRIFT-2936
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2936
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9.3
>         Environment: Ubuntu 14.04.1 LTS
>            Reporter: Cristian Klein
>            Assignee: Randy Abernethy
>            Priority: Minor
>              Labels: easyfix, newbie, patch
>             Fix For: 0.9.3
>
>         Attachments: 0001-THRIFT-2936-Fix-minor-memory-leak-in-SSL.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> Valgrind shows that Thrift clients that use SSL leak 64 bytes in two chunks. 
> This is because the list of available compression methods is not freed.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to