I'm getting a memcpy failure on line 594 of ssl\s3_pkt.c (openssl
0.9.5.a).It seems to only happen when I have several threads (5 +) in the
same application. It always occurs on the write, I have never had any
problems on a read. Further it always happens in the server side. I've
included a snippet of code from my initialization of the server side that
might be helpful in figuring this out - ie, did I make a stupid mistake in
setting things up. If anyone has seen this or has suggestions on how to
figure out why the memcpy fails when it *seems* to have a valid SSL_Record
struct please let me know. Is there an easy way for me to enable more
detailed debugging in the SSL library?

Any help would be appreciated.

Bill Browning

---- CODE SNIP ----

Class variables:

Class CSSLSocket{

*** LOTS OF STUFF SNIPPED OUT ***

 static SSL_CTX       *m_Ssl_ctx;
  SSL                  *m_Ssl;
  BIO                  *m_Ssl_bio;
  BIO                  *m_Out;
  static std::vector< std::pair<BIO *, SOCKET> >         m_Open_SSLSockets;
};


Function:

bool CSSLSocket::InitializeSSLServer()
{
//create a new context struct
  // we want to use SSL v.3 in server mode with fallback to
  // SSL v.2.
  if(m_Ssl_ctx == NULL)
  {
        m_Ssl_ctx = SSL_CTX_new(SSLv23_server_method());
  }
  if(m_Ssl_ctx == NULL)
    {
      printf("Failed to create new SSL context!\n");
      return false;
    }
  else
    {
          if(!
SSL_CTX_use_certificate_file(m_Ssl_ctx,m_CertificateFile.ascii(),
SSL_FILETYPE_PEM))
          {
                ERR_print_errors_fp(stdout);
          }
          //set the private key to use.
          if(!
SSL_CTX_use_PrivateKey_file(m_Ssl_ctx,m_CertificateFile.ascii(),SSL_FILETYPE
_PEM))
            {
                  ERR_print_errors_fp(stdout);
            }
          //make sure the private key listed in the the PEM is okay.
          if(! SSL_CTX_check_private_key(m_Ssl_ctx))
            {
                  ERR_print_errors_fp(stdout);
            }
          SSL_CTX_set_cipher_list(m_Ssl_ctx, m_EnabledCiphers.ascii());
          
          //set the statemachine.
          m_Ssl = SSL_new(m_Ssl_ctx);
          SSL_set_accept_state(m_Ssl);
      SSL_set_options(m_Ssl,SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);

          //set up the server BIO
          m_Ssl_bio = BIO_new(BIO_f_ssl());
          BIO_set_ssl(m_Ssl_bio,m_Ssl, BIO_CLOSE);
          //start accepting connections on the desired socket
          m_Out = BIO_new_socket(m_hSocket, BIO_NOCLOSE );
          if(m_Out == NULL)
            {
                  ERR_print_errors_fp(stdout);
            }
          BIO_set_close(m_Out,0); //do not close the socket, the underlying
class can do that for us.
          m_Out = BIO_push(m_Ssl_bio, m_Out);
        }

  m_CryptorActive = true;
  pair< BIO *, SOCKET> item;
  item.first = m_Out;
  item.second = SocketHandle();
CSynchro::ESYNCH_ERROR eError         = CSynchro::SUCCESS;
  eError = m_csSSLSockets.Grab();
  assert(eError == CSynchro::SUCCESS);
  m_Open_SSLSockets.insert(m_Open_SSLSockets.end(),item);
m_csSSLSockets.Release();
  _RPT1(_CRT_WARN, "\n\nCreating m_Out:%lx on socket: %lx\n\n",
m_Out,m_hSocket);

  return true;
  
}
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to