Fastream Technologies wrote:
> Dear Arno,
> 
> I have written the below code after your suggestion and wish to get
> your feedback before uploading as a beta:

I can't say whether it's OK or not. Just make sure that all your 
TSslxxxx objects in that thread are assigned a SslContext created
in the same thread context. No TSslxxxx object must be assigned a 
SslContext created in a different thread context. With such a design
you are on the safe side. If that doesn't help to fix the AV there
must be still something else going wrong.

-- 
Arno Garrels

> 
> void __fastcall ReverseProxyClientThread::Execute() // multiple worker
> client objects, both TSslHttpCli's and THttpConnections are in the
> context 
> of this
> {
> //---- Place thread code here ----
> FreeOnTerminate = true;
> 
> initSSLContexes();
> 
> while(!Terminated)
> messagePump();
> 
> destroySSLContexes();
> }
> //---------------------------------------------------------------------------
> void __fastcall ReverseProxyClientThread::initSSLContexes(void)
> {
> sslContextList = new TList();
> 
> TSslContext *HTTPSSLContext;
> EncryptionSettings *encryptionSettings;
> 
> lockCriticalSection(serverThread->SNIContainer->CS);
> 
> for(int i = 0; i < serverThread->SNIContainer->SNIDomains->Count; ++i)
> {
> HTTPSSLContext = new TSslContext(NULL);
> sslContextList->Add(HTTPSSLContext);
> 
> encryptionSettings =
> (EncryptionSettings*)serverThread->SNIContainer->SNIDomains->Objects[i];
> // contains different SNI domains' configuration data--protected by
> the SNIContainer->CS critical section
> 
> HTTPSSLContext->SslVerifyPeer = false;
> HTTPSSLContext->SslVerifyDepth = 9;
> HTTPSSLContext->SslOptions << sslOpt_MICROSOFT_SESS_ID_BUG <<
> sslOpt_NETSCAPE_CHALLENGE_BUG <<
> sslOpt_NETSCAPE_REUSE_CIPHER_CHANGE_BUG <<
> sslOpt_SSLREF2_REUSE_CERT_TYPE_BUG <<
> sslOpt_MICROSOFT_BIG_SSLV3_BUFFER << sslOpt_SSLEAY_080_CLIENT_DH_BUG
> << sslOpt_TLS_D5_BUG << sslOpt_TLS_BLOCK_PADDING_BUG,
> sslOpt_TLS_ROLLBACK_BUG << sslOpt_NO_SSLv2 <<
> sslOpt_NETSCAPE_CA_DN_BUG <<
> sslOpt_NO_SESSION_RESUMPTION_ON_RENEGOTIATION <<
> sslOpt_NETSCAPE_DEMO_CIPHER_CHANGE_BUG;   
> HTTPSSLContext->SslVerifyPeerModes << SslVerifyMode_PEER;
> HTTPSSLContext->SslSessionCacheModes << sslSESS_CACHE_SERVER;
> HTTPSSLContext->SslCipherList = "ALL:!ADH:!DES:RC4:@STRENGTH";
> HTTPSSLContext->SslVersionMethod = sslV23_SERVER;
> HTTPSSLContext->SslSessionTimeout = 300;
> HTTPSSLContext->SslSessionCacheSize = 20480;
> 
> HTTPSSLContext->SslCertFile = encryptionSettings->certFile;
> HTTPSSLContext->SslPrivKeyFile = encryptionSettings->privateKey;
> HTTPSSLContext->SslCAFile = encryptionSettings->CAFile;
> HTTPSSLContext->SslCAPath = encryptionSettings->CAPath;
> 
> HTTPSSLContext->SslOptions >> sslOpt_NO_SSLv2 >> sslOpt_NO_SSLv3 >>
> sslOpt_NO_TLSv1;
> 
> if(!encryptionSettings->useSSLv2)
> HTTPSSLContext->SslOptions = TSslOptions() << sslOpt_NO_SSLv2;
> if(!encryptionSettings->useSSLv3)
> HTTPSSLContext->SslOptions = TSslOptions() << sslOpt_NO_SSLv3;
> if(!encryptionSettings->useTLSv1)
> HTTPSSLContext->SslOptions = TSslOptions() << sslOpt_NO_TLSv1;
> 
> HTTPSSLContext->SslSessionCacheModes = TSslSessCacheModes() <<
> sslSESS_CACHE_SERVER << sslSESS_CACHE_NO_INTERNAL_LOOKUP <<
> sslSESS_CACHE_NO_INTERNAL_STORE;
> HTTPSSLContext->SslOptions << sslOpt_CIPHER_SERVER_PREFERENCE;
> 
> try
> {
> HTTPSSLContext->InitContext();
> }
> catch(Exception &e)
> {
> }
> }
> 
> releaseCriticalSection(serverThread->SNIContainer->CS);
> }
> //---------------------------------------------------------------------------
> void __fastcall ReverseProxyClientThread::destroySSLContexes(void)
> {
> for(int i = sslContextList->Count - 1; i >= 0; --i)
> delete (TSslContext*)sslContextList->Items[i];
> 
> delete sslContextList;
> }
> //---------------------------------------------------------------------------
> 
> This seems okay to me but maybe you have something to say!
> 
> Best Regards,
> 
> SZ
> 
> On Sat, Dec 4, 2010 at 5:17 PM, Fastream Technologies
> <ga...@fastream.com>wrote: 
> 
>> Hello,
>> 
>> On Sat, Dec 4, 2010 at 3:55 PM, Arno Garrels <arno.garr...@gmx.de>
>> wrote: 
>> 
>>> Fastream Technologies wrote:
>>>> Dear Arno,
>>>> 
>>>> On Sat, Dec 4, 2010 at 2:11 PM, Arno Garrels <arno.garr...@gmx.de>
>>>> wrote:
>>>> 
>>>>> Fastream Technologies wrote:
>>>>>> Hello,
>>>>>> 
>>>>>> I have received the below report from a tester. What could be the
>>>>>> cause of it, any idea?
>>>>> 
>>>>> From the stack trace it looks like the exception is raised
>>>>> in TComponent.RemoveFreeNotifications of the CtrlSocket.
>>>>> 
>>>>> Is the SslContext or an IcsLogger instance shared across multiple
>>>>> threads? If so, they might have been destroyed by another thread
>>>>> yet? 
>>>>> 
>>>>> Do you make sure that all threads are finished before you exit the
>>>>> application?
>>> 
>>>> We do not use IcsLoggers as NO_DEBUG_LOG is defined. We have
>>>> TSslContext objects defined in the listener thread which has many
>>>> worker threads with THttpConnection's and TSslHttpCli's inside.
>>>> This exception is not thrown when the program is exiting and when
>>>> the worker threads are destructed. We have separate thread,
>>> 
>>> The VCL and its component notification system is not thread-safe,
>>> that's likely the cause of the AV. Change your code to use one
>>> instance of TSslContext per thread, that should resolve it (I
>>> remember I claimed that TSslContext was thread-safe some years
>>> back, but did not take component notification into account, sorry).
>>> 
>>> --
>>> Arno Garrels
>>> 
>> 
>> 
>> The site that is having problems is NOT using SSL at all. In their
>> case there is just a listener SSL port with no traffic (but has a
>> TSslContext) and some TSslHttpCli's which connect to HTTP web
>> server--does your advice still apply?
>> 
>> Regards,
>> 
>> SZ
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to