Преглед на файлове

SimpleRandmizer: Fix certain bits generated by getRandomBytes are always 0

This is because in Linux RAND_MAX is 2**31-1 and we used int32_t to
hold random number from random() and got each bytes. This means that
highest bit is always unset. In little endian system, every 4n-th (n
>=0) byte has highest bit is unset. To fix this, we just use lower 2
bytes of random().
Tatsuhiro Tsujikawa преди 12 години
родител
ревизия
7f18494a8c
променени са 1 файла, в които са добавени 5 реда и са изтрити 4 реда
  1. 5 4
      src/SimpleRandomizer.cc

+ 5 - 4
src/SimpleRandomizer.cc

@@ -123,11 +123,12 @@ void SimpleRandomizer::getRandomBytes(unsigned char *buf, size_t len)
   }
 #else
   while (len) {
+    // If RAND_MAX is less than 2**16-1, we are in trouble.
     union {
-      int32_t r;
-      uint8_t b[4];
-    } r = { (int32_t)random() };
-    for (auto i = 0; i < 4 && len; ++i, --len) {
+      uint16_t r;
+      uint8_t b[2];
+    } r = { (uint16_t)(random() & 0xffffu) };
+    for (auto i = 0; i < 2 && len; ++i, --len) {
       *buf++ = r.b[i];
     }
   }