OpenSSL

やっぱり OpenSSL おかしい。
OpenSSL Win32版 (VC++コンパイル、/MT オプション) で、マルチスレッドで RAND_bytes 関数を同時に2つのスレッドから呼び出すと、両方とも暴走して無限ループになるかクラッシュする。
ついでに、SSL_accept 関数を呼び出すのとほぼ同時に RAND_bytes 関数を別のスレッドから呼び出すと、SSL_accept 関数がクラッシュする。
また、同一の X509 証明書と EVP_PKEY を SSL_use_certificate や SSL_use_PrivateKey で異なる SSL 構造体に割り当てると、クラッシュする。
上記のようなことは普通は起こらないが、同期ソケットを使っていて大量の SSL 接続 (1秒間に100コネクションくらい) を受け付ける必要があるサーバープロセスでは、稀に発生する可能性がある。
OpenSSL は一応スレッドセーフだとどこかで読んだ覚えがあるが、まだバグが残っているのだろうか。とりあえず OpenSSL のコードを書き換えて危なそうな部分をアトミックにすると、落ちなくなった。