stream-ssl: Seed OpenSSL if it fails to seed itself.
authorBen Pfaff <blp@nicira.com>
Thu, 9 Aug 2012 21:18:46 +0000 (14:18 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 9 Aug 2012 21:18:46 +0000 (14:18 -0700)
commit47ebcf25ef6d1475b5e634d79218ad553f72fdcd
treeef77a31e9323ba2a4e55d8ae01185dd8f3a7c1d0
parenteefbf18198a131d479762b1d37be3552e7271acb
stream-ssl: Seed OpenSSL if it fails to seed itself.

We occasionally see OpenSSL fail to seed its random number generator in
heavily loaded hypervisors.  I suspect the following scenario:

1. OpenSSL calls read() to get 32 bytes from /dev/urandom.
2. The kernel generates 10 bytes of randomness and copies it out.
3. A signal arrives (perhaps SIGALRM).
4. The kernel interrupts the system call to service the signal.
5. Userspace gets 10 bytes of entropy.
6. OpenSSL doesn't read again to get the final 22 bytes.  Therefore
   OpenSSL doesn't have enough entropy to consider itself initialized.
   It never tries again, so we're stuck forever.

The only part I'm not entirely sure about is #6, because the OpenSSL code
is so hard to read.

Thanks to Alex Yip for suggesting that this might be a startup problem.

Bug #10164.
Reported-by: Ram Jothikumar <ram@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/stream-ssl.c