Index: src/v8.cc |
=================================================================== |
--- src/v8.cc (revision 5846) |
+++ src/v8.cc (working copy) |
@@ -44,6 +44,7 @@ |
bool V8::has_been_disposed_ = false; |
bool V8::has_fatal_error_ = false; |
+ |
bool V8::Initialize(Deserializer* des) { |
bool create_heap_objects = des == NULL; |
if (has_been_disposed_ || has_fatal_error_) return false; |
@@ -176,25 +177,44 @@ |
} |
-uint32_t V8::Random() { |
- // Random number generator using George Marsaglia's MWC algorithm. |
- static uint32_t hi = 0; |
- static uint32_t lo = 0; |
+typedef struct { |
+ uint32_t hi; |
+ uint32_t lo; |
+} random_state; |
+ |
+// Random number generator using George Marsaglia's MWC algorithm. |
+static uint32_t random_base(random_state *state) { |
// Initialize seed using the system random(). If one of the seeds |
// should ever become zero again, or if random() returns zero, we |
// avoid getting stuck with zero bits in hi or lo by re-initializing |
// them on demand. |
- if (hi == 0) hi = random_seed(); |
- if (lo == 0) lo = random_seed(); |
+ if (state->hi == 0) state->hi = random_seed(); |
+ if (state->lo == 0) state->lo = random_seed(); |
// Mix the bits. |
- hi = 36969 * (hi & 0xFFFF) + (hi >> 16); |
- lo = 18273 * (lo & 0xFFFF) + (lo >> 16); |
- return (hi << 16) + (lo & 0xFFFF); |
+ state->hi = 36969 * (state->hi & 0xFFFF) + (state->hi >> 16); |
+ state->lo = 18273 * (state->lo & 0xFFFF) + (state->lo >> 16); |
+ return (state->hi << 16) + (state->lo & 0xFFFF); |
} |
+// Used by JavaScript APIs |
+uint32_t V8::Random() { |
+ static random_state state = {0, 0}; |
+ return random_base(&state); |
+} |
+ |
+ |
+// Used internally by the JIT and memory allocator for security |
+// purposes. So, we keep a different state to prevent informations |
+// leaks that could be used in an exploit. |
+uint32_t V8::RandomPrivate() { |
+ static random_state state = {0, 0}; |
+ return random_base(&state); |
+} |
+ |
+ |
bool V8::IdleNotification() { |
// Returning true tells the caller that there is no need to call |
// IdleNotification again. |