Barry Moore wrote,
> Anyone there have an idea as to when the new 0.9.6h release will
> occur ?
>
> We need to build a kit that includes the "race condition" fixes
> implemented several weeks ago, but I can't see any "chatter" as to
> when the official release will be.

Thanks for pointing me at this patch.

Looking at it tho', there's still a couple of problems. Here's one 
example of the first one,

  if (init)
  {
    CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);
 
    memcpy((char *)&SSLv23_client_data,
      (char *)sslv23_base_method(),sizeof(SSL_METHOD));
    SSLv23_client_data.ssl_connect=ssl23_connect;
    SSLv23_client_data.get_ssl_method=ssl23_get_client_method;
    init=0;

    CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
  }

There needs to be a second check of init *inside* the critical section, 
ie.,

  if (init)
  {
    CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);

    if (init)
    {
      memcpy((char *)&SSLv23_client_data,
        (char *)sslv23_base_method(),sizeof(SSL_METHOD));
      SSLv23_client_data.ssl_connect=ssl23_connect;
      SSLv23_client_data.get_ssl_method=ssl23_get_client_method;
      init=0;
    }

    CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
  }

Here's why: suppose we have two threads racing; both see init != 0, so 
they both enter the conditional; one will enter the critical section 
first; but once it leaves the second thread will acquire the lock and 
execute the initialization code a second time. Adding the second check 
within the scope of the lock prevents the the double initialization 
(well, not necessarily, see below). This is the "double checked 
locking" pattern, see,

  http://www.cs.wustl.edu/~schmidt/editorial-3.html

It doesn't actually look as tho' a double initialization is going to do 
any real harm here, but even so ... there are lots of apparently 
innocuous changes to the initialization code which could make a double 
initialization dangerous.

Unfortunately there's more, because there's no guarantee that this fixes 
things on all processor architectures, especially (tho' not 
exclusively) with SMP machines. Depending on the underlying memory 
model there are varying guarantees about when writes from one thread 
are visible to reads from another. Marking init as volatile might help, 
but isn't guaranteed to. Strictly speaking you need to insert processor 
specific read and write memory barrier instructions to be absolutely 
sure that all threads have a consistent view of the value of init.

I know Doug Schmidt wrote an article that went into all the gory 
details, but I can't lay my hands on it right now. Googling for 
something like,

  double checked locking memory barrier pthread

will probably pull up something useful.

An alternative might be simply to use pthread_once and pray that the 
platforms' implementation is correct (I suspect that in quite a few 
cases it's not).

Cheers,


Miles
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to