summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2014-07-28 16:53:43 -0400
committerBernard Normier <bernard@zeroc.com>2014-07-28 16:53:43 -0400
commitbf89a1b51b56231fddb9939596a39b5c7d86a1e0 (patch)
tree43698ed84b34b7bb4f54d33b398b063220715872 /cpp/src/IceUtil
parentCorrect __declspec for MinGW (diff)
downloadice-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.cpp48
-rw-r--r--cpp/src/IceUtil/UUID.cpp2
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