<rdar://problem/6358108> Insecure randomness in Math.random() leads to user tracking
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Dec 2008 07:21:03 +0000 (07:21 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Dec 2008 07:21:03 +0000 (07:21 +0000)
Reviewed by Mark Rowe

Switch to arc4random on PLATFORM(DARWIN), this is ~1.5x slower than random(), but the
it is still so fast that there is no fathomable way it could be a bottleneck for anything.

randomNumber is called in two places
  * During form submission where it is called once per form
  * Math.random in JSC.  For this difference to show up you have to be looping on
    a cached local copy of random, for a large (>10000) calls.

No change in SunSpider.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@39510 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/wtf/RandomNumber.cpp
JavaScriptCore/wtf/RandomNumberSeed.h

index 5493301..c5b8b87 100644 (file)
@@ -1,3 +1,24 @@
+2008-12-29  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Mark Rowe.
+
+        <rdar://problem/6358108> Insecure randomness in Math.random() leads to user tracking
+
+        Switch to arc4random on PLATFORM(DARWIN), this is ~1.5x slower than random(), but the
+        it is still so fast that there is no fathomable way it could be a bottleneck for anything.
+
+        randomNumber is called in two places
+          * During form submission where it is called once per form
+          * Math.random in JSC.  For this difference to show up you have to be looping on
+            a cached local copy of random, for a large (>10000) calls.
+
+        No change in SunSpider.
+
+        * wtf/RandomNumber.cpp:
+        (WTF::randomNumber):
+        * wtf/RandomNumberSeed.h:
+        (WTF::initializeRandomNumberGenerator):
+
 2008-12-29  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
 
         Rubber-stamped by Sam Weinig.
index cbf46f1..9d9b161 100644 (file)
@@ -50,7 +50,7 @@ double randomNumber()
 
     return static_cast<double>(u) / (static_cast<double>(UINT_MAX) + 1.0);
 #elif PLATFORM(DARWIN)
-    return static_cast<double>(random()) / (static_cast<double>(RAND_MAX) + 1.0);
+    return static_cast<double>(arc4random()) / (static_cast<double>(UINT32_MAX) + 1.0);
 #else
     return static_cast<double>(rand()) / (static_cast<double>(RAND_MAX) + 1.0);
 #endif
index 73ac124..c5f9580 100644 (file)
@@ -35,8 +35,10 @@ namespace WTF {
 inline void initializeRandomNumberGenerator()
 {
 #if PLATFORM(DARWIN)
-    srandomdev();
-#elif !COMPILER(MSVC) || !defined(_CRT_RAND_S)
+    // On Darwin we use arc4random which initialises itself.
+#elif COMPILER(MSVC) && defined(_CRT_RAND_S)
+    // On Windows we use rand_s which intialises itself
+#else
     srand(static_cast<unsigned>(time(0)));
 #endif
 }