diff options
author | Bernard Normier <bernard@zeroc.com> | 2014-07-28 16:53:43 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2014-07-28 16:53:43 -0400 |
commit | bf89a1b51b56231fddb9939596a39b5c7d86a1e0 (patch) | |
tree | 43698ed84b34b7bb4f54d33b398b063220715872 /cpp/src/IceUtil | |
parent | Correct __declspec for MinGW (diff) | |
download | ice-bf89a1b51b56231fddb9939596a39b5c7d86a1e0.tar.bz2 ice-bf89a1b51b56231fddb9939596a39b5c7d86a1e0.tar.xz ice-bf89a1b51b56231fddb9939596a39b5c7d86a1e0.zip |
Fixed ICE-5598 (generateRandom) and ICE-5520 (removed openssl/patch.mingw)
Diffstat (limited to 'cpp/src/IceUtil')
-rw-r--r-- | cpp/src/IceUtil/Random.cpp | 48 | ||||
-rw-r--r-- | cpp/src/IceUtil/UUID.cpp | 2 |
2 files changed, 32 insertions, 18 deletions
diff --git a/cpp/src/IceUtil/Random.cpp b/cpp/src/IceUtil/Random.cpp index 1df50d27855..f5f6773def3 100644 --- a/cpp/src/IceUtil/Random.cpp +++ b/cpp/src/IceUtil/Random.cpp @@ -93,12 +93,34 @@ Init init; #endif void -IceUtilInternal::generateRandom(char* buffer, int size) +IceUtilInternal::generateRandom(char* buffer, size_t size) { #ifdef _WIN32 - for(int i = 0; i < size; ++i) + int i = 0; + const size_t randSize = sizeof(unsigned int); + + while(size - i >= randSize) { - buffer[i] = random(256); + unsigned int r = 0; + errno_t err = rand_s(&r); + if(err != 0) + { + throw SyscallException(__FILE__, __LINE__, errno); + } + memcpy(buffer + i, &r, randSize); + i += randSize; + } + + if(size - i > 0) + { + assert(size - i < randSize); + unsigned int r = 0; + errno_t err = rand_s(&r); + if(err != 0) + { + throw SyscallException(__FILE__, __LINE__, errno); + } + memcpy(buffer + i, &r, size - i); } #else // @@ -110,7 +132,6 @@ IceUtilInternal::generateRandom(char* buffer, int size) fd = open("/dev/urandom", O_RDONLY); if(fd == -1) { - assert(0); throw SyscallException(__FILE__, __LINE__, errno); } } @@ -121,16 +142,13 @@ IceUtilInternal::generateRandom(char* buffer, int size) // int reads = 0; size_t index = 0; - while(reads <= 20 && index != static_cast<size_t>(size)) + while(reads <= 20 && index != size) { - ssize_t bytesRead = read(fd, buffer + index, static_cast<size_t>(size) - index); + ssize_t bytesRead = read(fd, buffer + index, size - index); if(bytesRead == -1 && errno != EINTR) { - SyscallException ex(__FILE__, __LINE__, errno); - cerr << "Reading /dev/urandom failed:\n" << ex << endl; - assert(0); - throw ex; + throw SyscallException(__FILE__, __LINE__, errno); } else { @@ -139,9 +157,8 @@ IceUtilInternal::generateRandom(char* buffer, int size) } } - if(index != static_cast<size_t>(size)) + if(index != size) { - assert(0); throw SyscallException(__FILE__, __LINE__, 0); } #endif @@ -155,13 +172,10 @@ IceUtilInternal::random(int limit) errno_t err = rand_s(&r); if(err != 0) { - SyscallException ex(__FILE__, __LINE__, errno); - cerr << "rand_s failed:\n" << ex << endl; - assert(0); - throw ex; + throw SyscallException(__FILE__, __LINE__, errno); } #else - generateRandom(reinterpret_cast<char*>(&r), static_cast<unsigned int>(sizeof(unsigned int))); + generateRandom(reinterpret_cast<char*>(&r), sizeof(unsigned int)); #endif if(limit > 0) { diff --git a/cpp/src/IceUtil/UUID.cpp b/cpp/src/IceUtil/UUID.cpp index c64c8cb1b70..3e7a25dff8b 100644 --- a/cpp/src/IceUtil/UUID.cpp +++ b/cpp/src/IceUtil/UUID.cpp @@ -135,7 +135,7 @@ IceUtil::generateUUID() // Randoms by the last 15 bits of the process id. // char* buffer = reinterpret_cast<char*>(&uuid); - IceUtilInternal::generateRandom(buffer, static_cast<int>(sizeof(UUID))); + IceUtilInternal::generateRandom(buffer, sizeof(UUID)); // // Adjust the bits that say "version 4" UUID |