diff options
author | Alexander Harkness <bearbin@gmail.com> | 2013-08-15 18:53:45 +0200 |
---|---|---|
committer | Alexander Harkness <bearbin@gmail.com> | 2013-08-15 18:53:45 +0200 |
commit | 54c8bf2e978b883aad984549c946386d50160c0e (patch) | |
tree | ea1ca93ff5607cf1c626bc102fb9961e22bf5984 /CryptoPP/osrng.cpp | |
parent | Fixed the Reload and Save-all console commands. (diff) | |
parent | Updated the makefile to disable assembly for clang. (diff) | |
download | cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar.gz cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar.bz2 cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar.lz cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar.xz cuberite-54c8bf2e978b883aad984549c946386d50160c0e.tar.zst cuberite-54c8bf2e978b883aad984549c946386d50160c0e.zip |
Diffstat (limited to 'CryptoPP/osrng.cpp')
-rw-r--r-- | CryptoPP/osrng.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/CryptoPP/osrng.cpp b/CryptoPP/osrng.cpp index fa6dd36dd..76e486b4e 100644 --- a/CryptoPP/osrng.cpp +++ b/CryptoPP/osrng.cpp @@ -83,8 +83,22 @@ void NonblockingRng::GenerateBlock(byte *output, size_t size) if (!CryptGenRandom(m_Provider.GetProviderHandle(), (DWORD)size, output)) throw OS_RNG_Err("CryptGenRandom"); #else - if (read(m_fd, output, size) != size) - throw OS_RNG_Err("read /dev/urandom"); + while (size) + { + ssize_t len = read(m_fd, output, size); + + if (len < 0) + { + // /dev/urandom reads CAN give EAGAIN errors! (maybe EINTR as well) + if (errno != EINTR && errno != EAGAIN) + throw OS_RNG_Err("read /dev/urandom"); + + continue; + } + + output += len; + size -= len; + } #endif } @@ -119,10 +133,17 @@ void BlockingRng::GenerateBlock(byte *output, size_t size) while (size) { // on some systems /dev/random will block until all bytes - // are available, on others it will returns immediately + // are available, on others it returns immediately ssize_t len = read(m_fd, output, size); if (len < 0) - throw OS_RNG_Err("read " CRYPTOPP_BLOCKING_RNG_FILENAME); + { + // /dev/random reads CAN give EAGAIN errors! (maybe EINTR as well) + if (errno != EINTR && errno != EAGAIN) + throw OS_RNG_Err("read " CRYPTOPP_BLOCKING_RNG_FILENAME); + + continue; + } + size -= len; output += len; if (size) |