Source/WebCore: Alignment crash in MIMESniffer
authorrwlbuis@webkit.org <rwlbuis@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jul 2012 18:09:56 +0000 (18:09 +0000)
committerrwlbuis@webkit.org <rwlbuis@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jul 2012 18:09:56 +0000 (18:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=89787

Reviewed by Yong Li.

PR 169064

Prevent ASSERT on unaligned data. Special-case handling of unaligned data
to maskedCompareSlowCase.

No test, too hard to reproduce.

* platform/network/MIMESniffing.cpp:
(std::maskedCompareSlowCase):
(std):
(std::maskedCompare):

Source/WTF: Alignment crash in MIMESniffer
https://bugs.webkit.org/show_bug.cgi?id=89787

Reviewed by Yong Li.

PR 169064

Change isPointerTypeAlignmentOkay so calling it does not require ifdefs.

* wtf/StdLibExtras.h:
(isPointerTypeAlignmentOkay):

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

Source/WTF/ChangeLog
Source/WTF/wtf/StdLibExtras.h
Source/WebCore/ChangeLog
Source/WebCore/platform/network/MIMESniffing.cpp

index c94173fedb078db3e8da82c5fde26a6f2526acb8..077562abf276ea4d1b279c81b599b5d9c6c1369d 100644 (file)
@@ -1,3 +1,17 @@
+2012-07-18  Rob Buis  <rbuis@rim.com>
+
+        Alignment crash in MIMESniffer
+        https://bugs.webkit.org/show_bug.cgi?id=89787
+
+        Reviewed by Yong Li.
+
+        PR 169064
+
+        Change isPointerTypeAlignmentOkay so calling it does not require ifdefs.
+
+        * wtf/StdLibExtras.h:
+        (isPointerTypeAlignmentOkay):
+
 2012-07-17  Gabor Ballabas  <gaborb@inf.u-szeged.hu>
 
         [Qt][V8] Remove the V8 related codepaths and configuration
index 89e549893688bbf8be7072e4fca343385982e93c..e66df2c310cf08f4be85f6ae9d511e0d7dcd20d5 100644 (file)
@@ -102,6 +102,11 @@ TypePtr reinterpret_cast_ptr(const void* ptr)
     return reinterpret_cast<TypePtr>(ptr);
 }
 #else
+template<typename Type>
+bool isPointerTypeAlignmentOkay(Type*)
+{
+    return true;
+}
 #define reinterpret_cast_ptr reinterpret_cast
 #endif
 
index a6eb8f7473febc37a7737bc6a52c026afb657c71..e0b05962251df26b45d207a94bc85e094a2ca20d 100644 (file)
@@ -1,3 +1,22 @@
+2012-07-18  Rob Buis  <rbuis@rim.com>
+
+        Alignment crash in MIMESniffer
+        https://bugs.webkit.org/show_bug.cgi?id=89787
+
+        Reviewed by Yong Li.
+
+        PR 169064
+
+        Prevent ASSERT on unaligned data. Special-case handling of unaligned data
+        to maskedCompareSlowCase.
+
+        No test, too hard to reproduce.
+
+        * platform/network/MIMESniffing.cpp:
+        (std::maskedCompareSlowCase):
+        (std):
+        (std::maskedCompare):
+
 2012-07-18  Steve VanDeBogart  <vandebo@chromium.org>
 
         Chrome/Skia: PDF print output does not have clickable links.
index 5efd17f138cc5ff4156c91a330a465b2660f4fbe..c019702fceaf21dcca9257b0b083c831f2eff03d 100644 (file)
@@ -233,11 +233,28 @@ static inline size_t dataSizeNeededForImageSniffing()
     return result;
 }
 
+static inline bool maskedCompareSlowCase(const MagicNumbers& info, const char* data)
+{
+    const char* pattern = reinterpret_cast<const char*>(info.pattern);
+    const char* mask = reinterpret_cast<const char*>(info.mask);
+
+    size_t count = info.size;
+
+    for (size_t i = 0; i < count; ++i) {
+        if ((*data++ & *mask++) != *pattern++)
+            return false;
+    }
+    return true;
+}
+
 static inline bool maskedCompare(const MagicNumbers& info, const char* data, size_t dataSize)
 {
     if (dataSize < info.size)
         return false;
 
+    if (!isPointerTypeAlignmentOkay(static_cast<const uint32_t*>(static_cast<const void*>(data))))
+        return maskedCompareSlowCase(info, data);
+
     const uint32_t* pattern32 = reinterpret_cast_ptr<const uint32_t*>(info.pattern);
     const uint32_t* mask32 = reinterpret_cast_ptr<const uint32_t*>(info.mask);
     const uint32_t* data32 = reinterpret_cast_ptr<const uint32_t*>(data);