I'm currently using OpenSSL 0.9.7d on windows through the ACE library. My
application is multithreaded, and use two SSL_CTX one for the thread that does
SSL_write() and one for the threads that do the SSL_read().
Everything goes fine for the major part, but some times I got error on the
SSL_read() call:
1244 -- 20040627-03:35:02 3 ACE_SSL (1092|1244) error code: 336216132 -
error:140A4044:SSL routines:SSL_clear:internal error
It's always the same error.
It happens from time to time, and I can't explain where it could come from. I
looked at the openssl source code, and the only place where this error could be
generated is in SSL_clear(), in this case:
if (s->new_session)
{
SSLerr(SSL_F_SSL_CLEAR,ERR_R_INTERNAL_ERROR);
return 0;
}
Why a call to SSL_read() may end in a call to SSL_clear() ? And what this
->new_session>0 would mean ? May it have some problems with multithreading ?(I'm
new to OpenSSL).
The ACE code to call SSL_read() is the following :
bytes_read = ::SSL_read (this->ssl_,
static_cast<char *> (buf),
n);
const int status = ::SSL_get_error (this->ssl_, bytes_read);
switch (status)
{
case SSL_ERROR_NONE:
if (timeout != 0)
ACE::restore_non_blocking_mode (handle, val);
return bytes_read;
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
errno = EWOULDBLOCK;
return -1;
case SSL_ERROR_ZERO_RETURN:
if (timeout != 0)
ACE::restore_non_blocking_mode (handle, val);
// The peer has notified us that it is shutting down via the SSL
// "close_notify" message so we need to shutdown, too.
(void) ::SSL_shutdown (this->ssl_);
return bytes_read;
case SSL_ERROR_SYSCALL:
if (bytes_read == 0)
// An EOF occured but the SSL "close_notify" message was not
// sent. This is a protocol error, but we ignore it.
return 0;
// If not an EOF, then fall through to "default" case.
// On some platforms (e.g. MS Windows) OpenSSL does not store
// the last error in errno so explicitly do so.
ACE_OS::set_errno_to_last_error ();
break;
default:
// Reset errno to prevent previous values (e.g. EWOULDBLOCK)
// from being associated with a fatal SSL error.
errno = 0;
ACE_SSL_Context::report_error ();
break;
}
return -1;
It seems that's the "default" case that display this error.
I would be glad to have any lights or help on this problem.
Thanks in advance.
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]