<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[277843] trunk/Source/WTF</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/277843">277843</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2021-05-20 18:28:17 -0700 (Thu, 20 May 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add missing locks in Language.cpp
https://bugs.webkit.org/show_bug.cgi?id=226059

Reviewed by Alex Christensen.

Add missing locks in Language.cpp. This was found via Clang Thread Safety Analysis.
Some of the overrideUserPreferredLanguages() call sites were failing to grab the
lock first.

Also use NeverDestroyed in preferredLanguagesOverride() instead of LazyNeverDestroyed
with std::call_once. All call sites are already grabbing a lock so there is no need
for extra synchronization.

* wtf/Language.cpp:
(WTF::WTF_REQUIRES_LOCK):
(WTF::userPreferredLanguagesOverride):
(WTF::overrideUserPreferredLanguages):
(WTF::userPreferredLanguages):
(WTF::preferredLanguagesOverride): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfLanguagecpp">trunk/Source/WTF/wtf/Language.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (277842 => 277843)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog       2021-05-21 00:40:47 UTC (rev 277842)
+++ trunk/Source/WTF/ChangeLog  2021-05-21 01:28:17 UTC (rev 277843)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2021-05-20  Chris Dumez  <cdumez@apple.com>
+
+        Add missing locks in Language.cpp
+        https://bugs.webkit.org/show_bug.cgi?id=226059
+
+        Reviewed by Alex Christensen.
+
+        Add missing locks in Language.cpp. This was found via Clang Thread Safety Analysis.
+        Some of the overrideUserPreferredLanguages() call sites were failing to grab the
+        lock first.
+
+        Also use NeverDestroyed in preferredLanguagesOverride() instead of LazyNeverDestroyed
+        with std::call_once. All call sites are already grabbing a lock so there is no need
+        for extra synchronization.
+
+        * wtf/Language.cpp:
+        (WTF::WTF_REQUIRES_LOCK):
+        (WTF::userPreferredLanguagesOverride):
+        (WTF::overrideUserPreferredLanguages):
+        (WTF::userPreferredLanguages):
+        (WTF::preferredLanguagesOverride): Deleted.
+
</ins><span class="cx"> 2021-05-19  Alex Christensen  <achristensen@webkit.org>
</span><span class="cx"> 
</span><span class="cx">         Add support for Navigation Timing Level 2
</span></span></pre></div>
<a id="trunkSourceWTFwtfLanguagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Language.cpp (277842 => 277843)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Language.cpp        2021-05-21 00:40:47 UTC (rev 277842)
+++ trunk/Source/WTF/wtf/Language.cpp   2021-05-21 01:28:17 UTC (rev 277843)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include <wtf/Language.h>
</span><span class="cx"> 
</span><ins>+#include <wtf/CheckedLock.h>
</ins><span class="cx"> #include <wtf/HashMap.h>
</span><span class="cx"> #include <wtf/NeverDestroyed.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="lines">@@ -36,7 +37,12 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><del>-static Lock userPreferredLanguagesMutex;
</del><ins>+static CheckedLock preferredLanguagesOverrideLock;
+static Vector<String>& preferredLanguagesOverride() WTF_REQUIRES_LOCK(preferredLanguagesOverrideLock)
+{
+    static NeverDestroyed<Vector<String>> override;
+    return override;
+}
</ins><span class="cx"> 
</span><span class="cx"> typedef HashMap<void*, LanguageChangeObserverFunction> ObserverMap;
</span><span class="cx"> static ObserverMap& observerMap()
</span><span class="lines">@@ -78,24 +84,18 @@
</span><span class="cx">     return emptyString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Vector<String>& preferredLanguagesOverride()
-{
-    static LazyNeverDestroyed<Vector<String>> override;
-    static std::once_flag onceKey;
-    std::call_once(onceKey, [&] {
-        override.construct();
-    });
-    return override;
-}
-
</del><span class="cx"> Vector<String> userPreferredLanguagesOverride()
</span><span class="cx"> {
</span><ins>+    Locker locker { preferredLanguagesOverrideLock };
</ins><span class="cx">     return preferredLanguagesOverride();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void overrideUserPreferredLanguages(const Vector<String>& override)
</span><span class="cx"> {
</span><del>-    preferredLanguagesOverride() = override;
</del><ins>+    {
+        Locker locker { preferredLanguagesOverrideLock };
+        preferredLanguagesOverride() = override;
+    }
</ins><span class="cx">     languageDidChange();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -111,7 +111,7 @@
</span><span class="cx"> Vector<String> userPreferredLanguages()
</span><span class="cx"> {
</span><span class="cx">     {
</span><del>-        auto locker = holdLock(userPreferredLanguagesMutex);
</del><ins>+        Locker locker { preferredLanguagesOverrideLock };
</ins><span class="cx">         Vector<String>& override = preferredLanguagesOverride();
</span><span class="cx">         if (!override.isEmpty())
</span><span class="cx">             return isolatedCopy(override);
</span></span></pre>
</div>
</div>

</body>
</html>