[Corrected]
Hi ,
I replaced the call to SSL_accept to this one and it worked !!! Thanks for
your help.

int i =0;
while(1 == i) 
            {
                dRetVal = SSL_accept(pSsl);
                if(!(SSL_ERROR_WANT_READ == SSL_get_error(pSsl,dRetVal)))
                    i=0;
            }

So, this kind of condition should be put for every non-blocking SSL call ?


vne wrote:
> 
> Hi,
> I replaced the call to SSL_select to this one and it worked !!! Thanks for
> your help.
> 
> int i =0;
> while(1 == i) 
>             {
>                 dRetVal = SSL_accept(pSsl);
>                 if(!(SSL_ERROR_WANT_READ == SSL_get_error(pSsl,dRetVal)))
>                     i=0;
>             }
> 
> So, this kind of condition should be put for every non-blocking SSL call ?
> 
> 
> vne wrote:
>> 
>> You are right that I am making a non-blocking SSL_accept call.
>> 
>> The problem is on vxWorks when 'select' states that some connection
>> request is present, SSL_accept returns failure with error code as
>> SSL_ERROR_WANT_READ.
>> 
>> But if I add some delay in between this 'select' and 'SSL_accept', then
>> it returns with successful handshake.
>> 
>> Moreover, this behavior is not observed on Linux Platform.
>> 
>> As per documentation, in case of non-blocking socket, should I call
>> 'select' again to check in the request is still there and then call
>> SSL_accept again? 
>> Or I am missing something?
>> 
>> Thanks for replying.
>> 
>> 
>> 
>> 
>> David Schwartz wrote:
>>> 
>>> 
>>>> Hi,
>>>> I am trying to use SSL_accept on vxWorks 5.5 (Pentium). But when the
>>>> SSL
>>>> client sends the initial handshake message (Client Hello),
>>>> then SSL_accept returns failure with error as SSL_ERROR_WANT_READ.
>>>>
>>>> The same code works fine when used on Linux platform and
>>>> handshake completes
>>>> successfully.
>>>>
>>>> On server side, when select returns success, TCP accept is called and
>>>> finally SSL_accept is called.
>>>> the following snippet shows the code flow:
>>>>
>>>> pSslCtx = SSL_CTX_new(TLSv1_method());
>>>>
>>>>
>>>> ...
>>>> SSL_set_accept_state(pSsl);
>>>> dRetVal = SSL_accept(pSsl);
>>>>                    ssl3_accept
>>>>                        ssl3_get_client_hello
>>>>                           ssl3_get_message
>>>>                                 ssl3_read_bytes
>>>>                                      ssl3_get_record
>>>>                                            ssl3_read_n
>>>>                                                   BIO_read
>>>>
>>>>
>>>> The function SSL_accept internally calls ssl3_get_client_hello,
>>>> and finally
>>>> function BIO_read is called to read the Hello message. This
>>>> function returns
>>>> failure while reading.
>>>>
>>>> If I use a debugger and browse the exection step by step then
>>>> everything
>>>> works fine.
>>>> Also, if I add some delay (by adding sleep(2)) before BIO_read, then
>>>> also
>>>> everything works fine.
>>>>
>>>> Please suggest what may be the reason for this. Is something missing in
>>>> initilization part ?
>>>> or can I make the call of BIO_read blocking ?
>>> 
>>> What are you trying to do? Are you attempting a blocking SSL_accept or a
>>> non-blocking one? It sounds like you are correctly doing a non-blocking
>>> SSL_accept, and OpenSSL is correctly informing you that an accept would
>>> have
>>> to block because data OpenSSL needs to read has not arrived yet.
>>> 
>>> This is documented behavior:
>>> 
>>>        If the underlying BIO is non-blocking, SSL_accept() will also
>>> return
>>>        when the underlying BIO could not satisfy the needs of
>>> SSL_accept()
>>> to
>>>        continue the handshake, indicating the problem by the return
>>> value -1.
>>>        In this case a call to SSL_get_error() with the return value of
>>>        SSL_accept() will yield SSL_ERROR_WANT_READ or
>>> SSL_ERROR_WANT_WRITE.
>>>        The calling process then must repeat the call after taking
>>> appropriate
>>>        action to satisfy the needs of SSL_accept().  The action depends
>>> on
>>> the
>>>        underlying BIO. When using a non-blocking socket, nothing is to
>>> be
>>>        done, but select() can be used to check for the required
>>> condition.
>>>        When using a buffering BIO, like a BIO pair, data must be written
>>> into
>>>        or retrieved out of the BIO before being able to continue.
>>> 
>>> DS
>>> 
>>> 
>>> ______________________________________________________________________
>>> OpenSSL Project                                 http://www.openssl.org
>>> User Support Mailing List                    openssl-users@openssl.org
>>> Automated List Manager                           [EMAIL PROTECTED]
>>> 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Problem-in-using-SSL_accept-on-vxWorks-5.5-%28Pentium%29-tp19454074p19456955.html
Sent from the OpenSSL - User mailing list archive at Nabble.com.

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to