On Thu, Sep 05, 2002 at 10:57:59PM +0200, Pierre Chifflier wrote:
> SSL_ERROR_WANT_READ, I must iterate on SSL_accept. I've done the following:
> 
> 8<--------------------------------
>   SSL_set_accept_state(ssl);
>   fd = SSL_get_fd(ssl);
>   fcntl(fd,F_SETFL,(fcntl(fd,F_GETFL)|O_NONBLOCK));
>   do {
>     out_err(LEVEL_CRITICAL,"Before SSL_accept\n");
>     status = SSL_accept(ssl);
>     sslerr = SSL_get_error(ssl,status);
> 
>     if (status==1) {
>       out_err(LEVEL_INFO,"Data connection successfully switched to ssl mode\n");
>       context->ssl.data_mode = TLS_PRIV;
>       return 0;
>     } else {
>       FD_ZERO(&fd_r);
>       FD_ZERO(&fd_w);
>       tv.tv_usec = 0;
>       tv.tv_sec = 5;
>       switch (sslerr) {
>         case SSL_ERROR_WANT_READ:
>         FD_SET(fd,&fd_r);
> fprintf(stderr,"SSL_ERROR_WANT_READ\n");
>           break;
>         case SSL_ERROR_WANT_WRITE:
>         FD_SET(fd,&fd_w);
> fprintf(stderr,"SSL_ERROR_WANT_WRITE\n");
>           break;
>         default:
>           out_log(LEVEL_CRITICAL,"tls_auth_data_cont: error accepting: %s\n",
>             (char*)ERR_error_string(sslerr,NULL));
>           return 1;
>       }
>       r = select(fd+1, &fd_r, &fd_w, NULL, &tv);
>     }
>   } while (status == -1 && r != 0);
> 
>   if (r == 0) {
>     out_err(LEVEL_CRITICAL,"tls_auth_data_cont failed\n");
>     return -1;
>   }
> --------------------------------
> 
> The problem is that it never pass the SSL_accept - the output is:
> 
> Before SSL_accept
> SSL_ERROR_WANT_READ
> tls_auth_data_cont failed

I don't see the problem on the first glance. The "while" loop is being left,
which indicates that status!=-1 or r==0.
The case status==0 should be covered by the "default:" case, as it should
not result in WANT_READ or WANT_WRITE, so it should not matter, but
you might consider to explicitly think about this case.
So you should be facing r==0, shouldn't you, meaning that there is
a timeout condition and no data is to be read from "fd".

> New TCP connection #1: pollux.draw(33044) <-> localhost(2501)
> 1    5.0071 (5.0071)  S>C  TCP FIN
> 1 1  5.0092 (0.0021)  C>SV3.0(83)  Handshake
>       ClientHello
>         Version 3.0
>         random[32]=
>           3d 77 c2 f5 38 86 6c bd 7b 40 73 75 ad 3a 19 2c
>           de 76 25 64 88 a1 93 5e b8 3d aa ac fe 88 d1 61
>         cipher suites
>         SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
> ...
>         SSL_RSA_EXPORT_WITH_RC4_40_MD5
>         compression methods
>                   NULL

So it seems that the client sends at least some data. Please check out
the examples in apps/s_cb.c. You can use the callbacks to have a look
into the I/O operations performed and see, at which point the failure
occurs. It finally may be something simple like listening on the wrong
socket :-)

Best regards,
        Lutz
-- 
Lutz Jaenicke                             [EMAIL PROTECTED]
http://www.aet.TU-Cottbus.DE/personen/jaenicke/
BTU Cottbus, Allgemeine Elektrotechnik
Universitaetsplatz 3-4, D-03044 Cottbus
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to