[WTF] RandomDevice should be initialized inside std::call_once
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Jul 2018 04:24:33 +0000 (04:24 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Jul 2018 04:24:33 +0000 (04:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186017

Reviewed by Darin Adler.

While Linux ports uses mutex-guarded static variables, Mac ports do not.
So we should guard static variables' initialization by using std::call_once.
This patch does it for RandomDevice.

* wtf/OSRandomSource.cpp:
(WTF::cryptographicallyRandomValuesFromOS):
* wtf/RandomDevice.h: Small fix for OS(FUCHSIA).

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

Source/WTF/ChangeLog
Source/WTF/wtf/OSRandomSource.cpp
Source/WTF/wtf/RandomDevice.h

index 8c32440..64a7d1e 100644 (file)
@@ -1,3 +1,18 @@
+2018-07-01  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [WTF] RandomDevice should be initialized inside std::call_once
+        https://bugs.webkit.org/show_bug.cgi?id=186017
+
+        Reviewed by Darin Adler.
+
+        While Linux ports uses mutex-guarded static variables, Mac ports do not.
+        So we should guard static variables' initialization by using std::call_once.
+        This patch does it for RandomDevice.
+
+        * wtf/OSRandomSource.cpp:
+        (WTF::cryptographicallyRandomValuesFromOS):
+        * wtf/RandomDevice.h: Small fix for OS(FUCHSIA).
+
 2018-07-01  Myles C. Maxfield  <mmaxfield@apple.com>
 
         [Cocoa] LastResort in the font family list causes emoji with joiners to be rendered as multiple .notdef characters
index c3d0895..016cc1b 100644 (file)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "OSRandomSource.h"
 
+#include <mutex>
 #include <wtf/NeverDestroyed.h>
 #include <wtf/RandomDevice.h>
 
@@ -33,7 +34,13 @@ namespace WTF {
 
 void cryptographicallyRandomValuesFromOS(unsigned char* buffer, size_t length)
 {
-    static NeverDestroyed<RandomDevice> device;
+    static LazyNeverDestroyed<RandomDevice> device;
+    static std::once_flag onceFlag;
+    std::call_once(
+        onceFlag,
+        [] {
+            device.construct();
+        });
     device.get().cryptographicallyRandomValues(buffer, length);
 }
 
index a593cac..237fe55 100644 (file)
@@ -34,7 +34,7 @@ namespace WTF {
 class RandomDevice {
     WTF_MAKE_NONCOPYABLE(RandomDevice);
 public:
-#if OS(DARWIN) || OS(WINDOWS)
+#if OS(DARWIN) || OS(FUCHSIA) || OS(WINDOWS)
     RandomDevice() = default;
 #else
     RandomDevice();