JavaScriptCore:
authorkjk <kjk@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 17 Feb 2007 09:07:39 +0000 (09:07 +0000)
committerkjk <kjk@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 17 Feb 2007 09:07:39 +0000 (09:07 +0000)
        Reviewed by Adam Roben.

        Fix crashes on ARM due to different struct packing. Based on a patch
        by Mike Emmel.
        * kjs/ustring.cpp: compile-time assert to make sure sizeof(UChar) == 2
        * kjs/ustring.h: pack UChar struct to ensure that sizeof(UChar) == 2
        * wtf/Assertions.h: add COMPILE_ASSERT macro for compile-time assertions

  WebCore:

        Reviewed by Adam Roben.

        Fix crashes on ARM due to different struct packing. Based on a patch
        from Mike Emmel.

        * platform/DeprecatedString.cpp: compile-time assert to make sure sizeof(DeprecatedChar) == 2
        * platform/DeprecatedString.h: pack DeprecatedChar struct to ensure that
        sizeof(DeprecatedChar) == 2. Move _internalBuffer in DeprecatedStringData
        to the end, to avoid crashes on ARM due to different struct packing.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/ustring.cpp
JavaScriptCore/kjs/ustring.h
JavaScriptCore/wtf/Assertions.h
WebCore/ChangeLog
WebCore/platform/DeprecatedString.cpp
WebCore/platform/DeprecatedString.h

index c99090817926f9b88fcba38d45725193b9813de5..c15c8fcef61c9683fd5987aaca466ce02e9c3da3 100644 (file)
@@ -1,3 +1,13 @@
+2007-02-17  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>
+
+        Reviewed by Adam Roben.
+
+        Fix crashes on ARM due to different struct packing. Based on a patch
+        by Mike Emmel.
+        * kjs/ustring.cpp: compile-time assert to make sure sizeof(UChar) == 2
+        * kjs/ustring.h: pack UChar struct to ensure that sizeof(UChar) == 2
+        * wtf/Assertions.h: add COMPILE_ASSERT macro for compile-time assertions
+
 2007-02-16  George Staikos  <staikos@kde.org>
 
         Reviewed by Maciej.
index 077844f4522fc6ca6efe39aa3a895077d321a448..3bce8285d560c244d364fc30c19789ba58d91bfa 100644 (file)
@@ -50,6 +50,8 @@ namespace KJS {
 extern const double NaN;
 extern const double Inf;
 
+COMPILE_ASSERT(sizeof(UChar) == 2, uchar_is_2_bytes)
+
 CString::CString(const char *c)
 {
   length = strlen(c);
index 7dd563b0ae8721896d64e7fc6144bc90c92b6447..75c8fa756295cdb364d4e364ef53a8f510e5fe62 100644 (file)
 
 #include <stdint.h>
 
+/* On ARM some versions of GCC don't pack structures by default so sizeof(UChar)
+   will end up being != 2 which causes crashes since the code depends on that. */
+#if COMPILER(GCC) && PLATFORM(ARM)
+#define PACK_STRUCT __attribute__((packed))
+#else
+#define PACK_STRUCT
+#endif
+
 /**
  * @internal
  */
@@ -84,7 +92,7 @@ namespace KJS {
     unsigned short unicode() const { return uc; }
 
     unsigned short uc;
-  };
+  } PACK_STRUCT;
 
   inline UChar::UChar() { }
   inline UChar::UChar(unsigned char h , unsigned char l) : uc(h << 8 | l) { }
index 940e023aa421c6799ebe86b27be63e48aa6be82d..805c4bb89ab3e5158c0cf9a09ec0cbffca0bc851 100644 (file)
@@ -155,6 +155,11 @@ while (0)
 
 #endif
 
+/* COMPILE_ASSERT */
+#ifndef COMPILE_ASSERT
+#define COMPILE_ASSERT(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
+#endif
+
 /* FATAL */
 
 #if FATAL_DISABLED
index 78000741c632d1c639ec201d302b434d1386f278..d63d08db13a11c908718ef20bda7344aca431f11 100644 (file)
@@ -1,3 +1,15 @@
+2007-02-17  Krzysztof Kowalczyk  <kkowalczyk@gmail.com>
+
+        Reviewed by Adam Roben.
+
+        Fix crashes on ARM due to different struct packing. Based on a patch
+        from Mike Emmel.
+
+        * platform/DeprecatedString.cpp: compile-time assert to make sure sizeof(DeprecatedChar) == 2
+        * platform/DeprecatedString.h: pack DeprecatedChar struct to ensure that
+        sizeof(DeprecatedChar) == 2. Move _internalBuffer in DeprecatedStringData
+        to the end, to avoid crashes on ARM due to different struct packing.
+
 2007-02-16  Adele Peterson  <adele@apple.com>
 
         Reviewed by Mitz.
index 0d488d1b426d39e76174f73bc831b6632dd0d780..c898f21cbfb7b03dd44f2326b045d16a5f8d9932 100644 (file)
@@ -51,6 +51,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+COMPILE_ASSERT(sizeof(DeprecatedChar) == 2, deprecated_char_is_2_bytes)
+
 #define CHECK_FOR_HANDLE_LEAKS 0
 
 #if PLATFORM(SYMBIAN)
index 953f7b12c61857932c2e6efdaffcb7151e851607..9209b818eac618dddb50f51e2afd6459696ec5c1 100644 (file)
 #ifndef DeprecatedString_h
 #define DeprecatedString_h
 
-#include <ctype.h>
-#include <wtf/unicode/Unicode.h>
 #include "DeprecatedCString.h"
 
+#include <wtf/unicode/Unicode.h>
+
+#include <ctype.h>
+
+/* On ARM some versions of GCC don't pack structures by default so sizeof(DeprecatedChar)
+   will end up being != 2 which causes crashes since the code depends on that. */
+#if COMPILER(GCC) && PLATFORM(ARM)
+#define PACK_STRUCT __attribute__((packed))
+#else
+#define PACK_STRUCT
+#endif
+
 #if PLATFORM(CF)
 typedef const struct __CFString * CFStringRef;
 #endif
@@ -73,7 +83,7 @@ public:
 
 private:
     unsigned short c;
-};
+} PACK_STRUCT;
 
 inline DeprecatedChar::DeprecatedChar() : c(0)
 {
@@ -227,13 +237,16 @@ struct DeprecatedStringData
     unsigned _length;
     mutable DeprecatedChar *_unicode;
     mutable char *_ascii;
-    char _internalBuffer[WEBCORE_DS_INTERNAL_BUFFER_SIZE]; // Pad out to a (((size + 1) & ~15) + 14) size
 
     unsigned _maxUnicode : 30;
     bool _isUnicodeValid : 1;
     bool _isHeapAllocated : 1; // Fragile, but the only way we can be sure the instance was created with 'new'.
     unsigned _maxAscii : 31;
     bool _isAsciiValid : 1;
+
+    // _internalBuffer must be at the end - otherwise it breaks on archs that
+    // don't pack structs on byte boundary, like some versions of gcc on ARM
+    char _internalBuffer[WEBCORE_DS_INTERNAL_BUFFER_SIZE]; // Pad out to a (((size + 1) & ~15) + 14) size
     
 private:
     DeprecatedStringData(const DeprecatedStringData &);