leyu zhu created THRIFT-4404: -------------------------------- Summary: 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
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 (v6.4.14#64029)