Which version of OpenSSL are you using? Or you are using BoringSSL? OpenSSL
1.1 or BoringSSL does not have such problems on OpenSSL init.

For OpenSSL 1.0x, it is a valid concern. Let me check what is the best way
to resolve this issue (pass a compiler flag, environment variable, or some
API changes).

Thanks,
Jiangtao


On Wed, Apr 18, 2018 at 7:34 PM Arpit Baldeva <abald...@gmail.com> wrote:

> To explain further, a library such as grpc intializing global settings of
> another library is not a good practice. Looking at libcurl (
> https://curl.haxx.se/libcurl/c/curl_global_init.html) , PostgreSQL(
> https://www.postgresql.org/docs/9.1/static/libpq-ssl.html ) (and may be
> there are more libraries), these take an initialization flag that to decide
> whether OpenSSL should be initialized internally or not.
>
> Actually, looking at
> https://stackoverflow.com/questions/21874152/openssl-thread-safety-callback-function-registration-with-both-direct-call-and-i
> , the simplest solution here is for grpc to check if locking callback
> already exists by calling CRYPTO_get_id_callback and if so, skip putting
> it's own locks. Rest of the init functions in OpenSSL are idempotent and
> hence can be called multiple times. And looks like grpc is not cleaning up
> OpenSSL so we are fine there too (looks like clean up calls are getting
> no-op in future -
> https://stackoverflow.com/questions/35802643/will-ignoring-to-call-openssl-evp-cleanup-result-in-serious-flaws-or-memory-leak
> ) .
>
>
> On Wednesday, April 18, 2018 at 4:09:01 PM UTC-7, Arpit Baldeva wrote:
>>
>> Again, I am not sure why you are focusing on the race condition.  Race
>> condition is not the problem. Fact that grpc decides to put some global
>> callbacks on the OpenSSL is the problem. It should not do that. Why can't
>> this be made optional via a compile time flag or some run time
>> initialization parameter?
>>
>> On Wednesday, April 18, 2018 at 3:52:47 PM UTC-7, Jiangtao Li wrote:
>>>
>>> I don't see a convenient way to do in gRPC. SSL init can be called
>>> multiple times, as long as it is not called in the same time. It seems that
>>> the best way to address is adding mutex in your application to make sure
>>> SSL init is not called simultaneously.
>>>
>>> On Wed, Apr 18, 2018 at 3:28 PM Arpit Baldeva <abal...@gmail.com> wrote:
>>>
>>>>
>>>> Yes, there are two parallel threads that do this at the same time. What
>>>> I was noticing is that at application shutdown, my application complained
>>>> about the lock I handed over to OpenSSL not being unlocked. Looking into
>>>> it, I realized that during initialization, OpenSSL grabbed a lock from my
>>>> callback, during this time, grpc replaced the locks and OpenSSL unlock call
>>>> got re-routed. But again, this is just a side effect. The real problem is
>>>> simply the fact that grpc is setting some global callbacks on OpenSSL that
>>>> should best be left to the application. I understand that this is probably
>>>> done to make it easy for the grpc integrators but there are applications
>>>> such as mine where there are other usage of OpenSSL and I'd rather manage
>>>> the global settings myself than rely on grpc to do it.
>>>>
>>>>
>>>>
>>>> On Wednesday, April 18, 2018 at 3:05:05 PM UTC-7, jian...@google.com
>>>> wrote:
>>>>>
>>>>> Could you describe the race condition in details?
>>>>>
>>>>> In gRPC ssl_transport_security, init_openssl() is only called when ssl
>>>>> transport security is needed. In your application, you are
>>>>> calling SSL_library_init() in a separate thread in parallel?
>>>>>
>>>>>
>>>>> On Wednesday, April 18, 2018 at 2:46:28 PM UTC-7, Arpit Baldeva wrote:
>>>>>>
>>>>>> I am using grpc-1.10.0 and it has that code. Looking at the latest
>>>>>> master, it still has that code -
>>>>>> https://github.com/grpc/grpc/blob/master/src/core/tsi/ssl_transport_security.cc
>>>>>> - see the init_openssl function.
>>>>>>
>>>>>> The problem is not just that grpc_init initialized the OpenSSL. The
>>>>>> problem is really that grpc is initializing OpenSSL internally and it can
>>>>>> trounce the application settings. Grpc should let application choose if
>>>>>> they want it to handle the OpenSSL initialization or not.
>>>>>>
>>>>>> Thanks.
>>>>>>
>>>>>> On Wednesday, April 18, 2018 at 12:25:58 PM UTC-7, jian...@google.com
>>>>>> wrote:
>>>>>>>
>>>>>>> Hi Arpit,
>>>>>>>
>>>>>>> grpc_init initializes OpenSSL for a short period (~2 days) and the
>>>>>>> code was later removed. Do you still the problem, if you fetch the 
>>>>>>> latest
>>>>>>> master?
>>>>>>>
>>>>>>> On Monday, April 16, 2018 at 2:22:32 PM UTC-7, Arpit Baldeva wrote:
>>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I recently pinned down a sporadic race condition in my application
>>>>>>>> due to grpc intializing OpenSSL internally. The problem is that 
>>>>>>>> OpenSSL has
>>>>>>>> some global callbacks that grpc is trying to initialize on it's own 
>>>>>>>> without
>>>>>>>> the authorization of the application. The problem is in the
>>>>>>>> init_openssl call in ssl_transport_security.cc which trounces
>>>>>>>> similar calls from the application. The situation is made worse(race
>>>>>>>> condition) if some application threads already have locks acquired via
>>>>>>>> previous calls and then grpc changes the stuff underneath before the 
>>>>>>>> locks
>>>>>>>> are released (hence the race condition).
>>>>>>>>
>>>>>>>> My application has usage of OpenSSL in a wider context than just
>>>>>>>> grpc. I get the point that grpc is wrapping this up to make it easier 
>>>>>>>> for
>>>>>>>> standing up an application with grpc but I think such type of things 
>>>>>>>> should
>>>>>>>> be accompanied by a compile/run time option supplied at grpc_init that
>>>>>>>> let's application decide the right owner. I am fine with the option
>>>>>>>> defaulting to grpc initializing the OpenSSL internally.
>>>>>>>>
>>>>>>>> Thoughts?
>>>>>>>>
>>>>>>>> Thanks.
>>>>>>>>
>>>>>>> --
>>>> You received this message because you are subscribed to a topic in the
>>>> Google Groups "grpc.io" group.
>>>> To unsubscribe from this topic, visit
>>>> https://groups.google.com/d/topic/grpc-io/Z48vpXRnJaw/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to
>>>> grpc-io+u...@googlegroups.com.
>>>> To post to this group, send email to grp...@googlegroups.com.
>>>> Visit this group at https://groups.google.com/group/grpc-io.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/grpc-io/3df13436-d771-4450-85c3-d2683b08e976%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/grpc-io/3df13436-d771-4450-85c3-d2683b08e976%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "grpc.io" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/grpc-io/Z48vpXRnJaw/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> grpc-io+unsubscr...@googlegroups.com.
> To post to this group, send email to grpc-io@googlegroups.com.
> Visit this group at https://groups.google.com/group/grpc-io.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/grpc-io/8821745f-9b23-4e3e-b4cf-b88bce513b4b%40googlegroups.com
> <https://groups.google.com/d/msgid/grpc-io/8821745f-9b23-4e3e-b4cf-b88bce513b4b%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To post to this group, send email to grpc-io@googlegroups.com.
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CACcm8_gs4%3DOE5NbUCsCLJjTStkwoJi7zLO%3D0W4iTS3ceQkRVAA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to