Static property hashtable should only lookup with non-symbol key
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 May 2015 15:28:24 +0000 (15:28 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 May 2015 15:28:24 +0000 (15:28 +0000)
https://bugs.webkit.org/show_bug.cgi?id=144438

Reviewed by Darin Adler.

Static property hashtable compares the Identifier's uid
with the normal C string without interning it.
So this comparison is performed in their contents.
As the result, in this comparison, symbol-ness is not considered.

So if accidentally the hash collision occur with the symbol and the string
and they have the same contents, the hash table entry is looked up incorrectly.

* runtime/Lookup.h:
(JSC::HashTable::entry):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/Lookup.h

index 32372ab..0ecd682 100644 (file)
@@ -1,3 +1,21 @@
+2015-05-02  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        Static property hashtable should only lookup with non-symbol key
+        https://bugs.webkit.org/show_bug.cgi?id=144438
+
+        Reviewed by Darin Adler.
+
+        Static property hashtable compares the Identifier's uid
+        with the normal C string without interning it.
+        So this comparison is performed in their contents.
+        As the result, in this comparison, symbol-ness is not considered.
+
+        So if accidentally the hash collision occur with the symbol and the string
+        and they have the same contents, the hash table entry is looked up incorrectly.
+
+        * runtime/Lookup.h:
+        (JSC::HashTable::entry):
+
 2015-05-01  Ryosuke Niwa  <rniwa@webkit.org>
 
         Class syntax should allow string and numeric identifiers for method names
 2015-05-01  Ryosuke Niwa  <rniwa@webkit.org>
 
         Class syntax should allow string and numeric identifiers for method names
index f0e674d..84aaf8e 100644 (file)
@@ -97,19 +97,22 @@ struct HashTable {
     {
         initializeIfNeeded();
 
     {
         initializeIfNeeded();
 
-        StringImpl* impl = propertyName.uid();
-        if (!impl)
-            return 0;
+        if (propertyName.isSymbol())
+            return nullptr;
+
+        StringImpl* uid = propertyName.uid();
+        if (!uid)
+            return nullptr;
 
         ASSERT(keys);
 
 
         ASSERT(keys);
 
-        int indexEntry = IdentifierRepHash::hash(impl) & indexMask;
+        int indexEntry = IdentifierRepHash::hash(uid) & indexMask;
         int valueIndex = index[indexEntry].value;
         if (valueIndex == -1)
         int valueIndex = index[indexEntry].value;
         if (valueIndex == -1)
-            return 0;
+            return nullptr;
 
         while (true) {
 
         while (true) {
-            if (WTF::equal(impl, keys[valueIndex]))
+            if (WTF::equal(uid, keys[valueIndex]))
                 return &values[valueIndex];
 
             indexEntry = index[indexEntry].next;
                 return &values[valueIndex];
 
             indexEntry = index[indexEntry].next;