[ https://issues.apache.org/jira/browse/THRIFT-4404?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James E. King III closed THRIFT-4404. ------------------------------------- Resolution: Information Provided Assignee: James E. King III Hi, sorry nobody's answered your question. In the C++ library none of the transport layers should be used by multiple threads simultaneously. I think the answer would depend on whether the OpenSSL library version in use was thread-safe, and whether we configured it correctly. > Is TSSLSocket is thred-safe in thift version 0.9.3? > --------------------------------------------------- > > Key: THRIFT-4404 > URL: https://issues.apache.org/jira/browse/THRIFT-4404 > Project: Thrift > Issue Type: Question > Components: C++ - Library > Affects Versions: 0.9.3 > Environment: Thrift running in Linux, C++ > Reporter: leyu zhu > Assignee: James E. King III > Priority: Major > > In my project, the thrift version 0.9.3 is used. > In the thrift client side, the processor.process(proto, proto, NULL) is > called to handle the callback event from server side in one separate thread. > (Complete function is below in Docs text) > From another thread, when the application close, the > proto->getTransport()->close() is called to terminate the above > processor.process(proto, proto, NULL). > Without TLS enabled, the program running very stable. > But if TLS enabled between thrift server and client, at the end of the > running, about 1/2000 possibility, the program could get segement > error-"Program received signal SIGSEGV, Segmentation fault.", the call stack > from GDB is below. > From the call stack, can seehe error is from the method uint32_t > TSSLSocket::read(uint8_t* buf, uint32_t len), in which the "bytes = > SSL_read(ssl_, buf, len) " trigger the Segmentation fault, seems the ssl_ > could be released during the executing of SSL_read. > Any friends have seen the similar issue or Is TSSLSocket is thred-safe in > thift version 0.9.3? > ======================GDB trace================================ > (gdb) bt full#0 0x00007fffe40a41f0 in ?? ()No symbol table info available.#1 > 0x00007ffff6d298ff in BIO_read () from > /app/openssl/1.0.1e/LMWP3/lib/libcrypto.so.1.0.0No symbol table info > available.#2 0x00007ffff704ba16 in ssl3_read_n () from > /app/openssl/1.0.1e/LMWP3/lib/libssl.so.1.0.0No symbol table info > available.#3 0x00007ffff704bf6c in ssl3_read_bytes () from > /app/openssl/1.0.1e/LMWP3/lib/libssl.so.1.0.0No symbol table info > available.#4 0x00007ffff704915a in ssl3_read () from > /app/openssl/1.0.1e/LMWP3/lib/libssl.so.1.0.0No symbol table info > available.#5 0x00007ffff6054975 in > apache::thrift::transport::TSSLSocket::read (this=0x7fffe408c990, > buf=0x7fffe408ced0 "", len=512) at src/thrift/transport/TSSLSocket.cpp:336 > errno_copy = <optimized out> error = <optimized out> errors > = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = > {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, > _M_p = 0x0}} retries = 1 bytes = 0#6 0x00007ffff605ad54 in > read (len=<optimized out>, buf=<optimized out>, this=<optimized out>) at > ./src/thrift/transport/TTransport.h:105No locals.#7 > apache::thrift::transport::TBufferedTransport::readSlow (this=0x7fffe40885c0, > buf=0x7ffff1b75cd0 "", len=4) at > src/thrift/transport/TBufferTransports.cpp:59 have = 0 > __PRETTY_FUNCTION__ = "virtual uint32_t > apache::thrift::transport::TBufferedTransport::readSlow(uint8_t*, uint32_t)" > SSL_READ_RETURN = 4294967295 reading_bytes = <optimized out>#8 > 0x000000000049b7cd in read (len=4, buf=0x7ffff1b75cd0 "", > this=0x7fffe40885c0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TBufferTransports.h:71 > new_rBase = 0x7fffe408ced5 "tionalModeizeNotificationChannel"#9 > apache::thrift::transport::readAll<apache::thrift::transport::TBufferBase> > (trans=..., buf=0x7ffff1b75cd0 "", len=len@entry=4) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TTransport.h:41 > have = 0 get = <optimized out>#10 0x000000000049b8ac in > readAll (len=4, buf=<optimized out>, this=0x7fffe40885c0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TBufferTransports.h:84 > new_rBase = 0x7fffe408ced5 "tionalModeizeNotificationChannel"#11 > readAll (len=4, buf=<optimized out>, this=0x7fffe40885c0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TBufferTransports.h:264No > locals.#12 > apache::thrift::transport::TVirtualTransport<apache::thrift::transport::TBufferedTransport, > apache::thrift::transport::TBufferBase>::readAll_virt (this=0x7fffe40885c0, > buf=<optimized out>, len=4) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TVirtualTransport.h:92No > locals.#13 0x00000000004c28dc in readAll (len=4, buf=0x7ffff1b75cd0 "", > this=<optimized out>) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/transport/TTransport.h:121No > locals.#14 readI32 (i32=<synthetic pointer>, this=0x7fffe408c6b0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/protocol/TBinaryProtocol.tcc:371 > theBytes = {b = "\000\000\000", all = 0}#15 > apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport, > apache::thrift::protocol::TNetworkBigEndian>::readMessageBegin > (this=0x7fffe408c6b0, name=..., messageType=@0x7ffff1b75d58: > apache::thrift::protocol::T_ONEWAY, seqid=@0x7ffff1b75d5c: 0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/protocol/TBinaryProtocol.tcc:203 > result = 0 sz = <optimized out>#16 0x00000000004c2ac1 in > apache::thrift::protocol::TVirtualProtocol<apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport, > apache::thrift::protocol::TNetworkBigEndian>, > apache::thrift::protocol::TProtocolDefaults>::readMessageBegin_virt > (this=<optimized out>, name=..., messageType=<optimized out>, > seqid=<optimized out>) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/protocol/TVirtualProtocol.h:403No > locals.#17 0x00000000004ab0ee in readMessageBegin (seqid=@0x7ffff1b75d5c: 0, > messageType=@0x7ffff1b75d58: apache::thrift::protocol::T_ONEWAY, name=..., > this=0x7fffe408c6b0) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/protocol/TProtocol.h:431No > locals.#18 process (connectionContext=0x0, out=<error reading variable: > access outside bounds of object referenced via synthetic pointer>, in=<error > reading variable: access outside bounds of object referenced via synthetic > pointer>, this=0x7ffff1b75d80) at > /home/eleyzhu/repo/lm/3pp/thrift-0.9.3.native-x86_64_Debug/install/usr/local/include/thrift/TDispatchProcessor.h:114 > fname = {static npos = <optimized out>, _M_dataplus = > {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data > fields>}, <No data fields>}, _M_p = 0x971d78 ""}} mtype = > apache::thrift::protocol::T_ONEWAY seqid = 0#19 > lmclient::ThriftClient<com::ericsson::licensing::lm::LicensingControlExtendedIf>::callbackThreadFunction > (this=0x7fffffffb1b0, proto=...) at > /home/eleyzhu/repo/lm/src/lmServer/src/thriftAPI/fet/ThriftClient.h:1005 > __func__ = "callbackThreadFunction" processor = > {<apache::thrift::TDispatchProcessor> = {<apache::thrift::TProcessor> = > {_vptr.TProcessor = 0x969030 <vtable for > com::ericsson::licensing::lm::LicensingNotificationsProcessor+16>, > eventHandler_ = {px = 0x0, pn = { pi_ = 0x0}}}, <No data > fields>}, iface_ = {px = 0x7fffe4081e70, pn = {pi_ = 0x7fffe4081e50}}, > processMap_ = {_M_t = { _M_impl = > {<std::allocator<std::_Rb_tree_node<std::pair<std::basic_string<char, > std::char_traits<char>, std::allocator<char> > const, void > (com::ericsson::licensing::lm::LicensingNotificationsProcessor::*)(int, > apache::thri---Type <return> to continue, or q <return> to > quit---ft::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, > void*)> > >> = > {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::basic_string<char, > std::char_traits<char>, std::allocator<char> > const, void > (com::ericsson::licensing::lm::LicensingNotificationsProcessor::*)(int, > apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, > void*)> > >> = {<No data fields>}, <No data fields>}, > _M_key_compare = {<std::binary_function<std::basic_string<char, > std::char_traits<char>, std::allocator<char> >, std::basic_string<char, > std::char_traits<char>, std::all -- This message was sent by Atlassian JIRA (v7.6.3#76005)