- fix buffer overruns seen on buildbot
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Jan 2008 02:00:26 +0000 (02:00 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Jan 2008 02:00:26 +0000 (02:00 +0000)
        * platform/text/StringImpl.cpp:
        (WebCore::countCharacter): Added this.
        (WebCore::StringImpl::toCoordsArray): Use countCharacter instead of incorrect find expression.
        (WebCore::StringImpl::toLengthArray): Ditto.
        (WebCore::StringImpl::replace): Added assertions.

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

WebCore/ChangeLog
WebCore/platform/text/StringImpl.cpp

index 957cd877b22d1f4b2b5273be509ed14391d3ba0e..7517e96a08fe84e96fdc614f6ae26d0d28c96900 100644 (file)
@@ -1,3 +1,13 @@
+2008-01-02  Darin Adler  <darin@apple.com>
+
+        - fix buffer overruns seen on buildbot
+
+        * platform/text/StringImpl.cpp:
+        (WebCore::countCharacter): Added this.
+        (WebCore::StringImpl::toCoordsArray): Use countCharacter instead of incorrect find expression.
+        (WebCore::StringImpl::toLengthArray): Ditto.
+        (WebCore::StringImpl::replace): Added assertions.
+
 2008-01-02  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
 2008-01-02  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 75ed22ec14ff5971533849dea8311807127f2c66..32bfe792dea9634faddd46564be9a30ea5b99ea9 100644 (file)
@@ -200,6 +200,15 @@ Length StringImpl::toLength()
     return parseLength(m_data, m_length);
 }
 
     return parseLength(m_data, m_length);
 }
 
+static int countCharacter(StringImpl* string, UChar character)
+{
+    int count = 0;
+    int length = string->length();
+    for (int i = 0; i < length; ++i)
+            count += (*string)[i] == character;
+    return count;
+}
+
 Length* StringImpl::toCoordsArray(int& len)
 {
     Vector<UChar> spacified(m_length);
 Length* StringImpl::toCoordsArray(int& len)
 {
     Vector<UChar> spacified(m_length);
@@ -214,7 +223,7 @@ Length* StringImpl::toCoordsArray(int& len)
 
     str = str->simplifyWhiteSpace();
 
 
     str = str->simplifyWhiteSpace();
 
-    len = (str->find(' ') >= 0) + 1;
+    len = countCharacter(str.get(), ' ') + 1;
     Length* r = new Length[len];
 
     int i = 0;
     Length* r = new Length[len];
 
     int i = 0;
@@ -227,6 +236,8 @@ Length* StringImpl::toCoordsArray(int& len)
     }
     r[i] = parseLength(str->characters() + pos, str->length() - pos);
 
     }
     r[i] = parseLength(str->characters() + pos, str->length() - pos);
 
+    ASSERT(i == len - 1);
+
     return r;
 }
 
     return r;
 }
 
@@ -238,7 +249,7 @@ Length* StringImpl::toLengthArray(int& len)
         return 0;
     }
 
         return 0;
     }
 
-    len = (str->find(',') >= 0) + 1;
+    len = countCharacter(str.get(), ',') + 1;
     Length* r = new Length[len];
 
     int i = 0;
     Length* r = new Length[len];
 
     int i = 0;
@@ -250,6 +261,8 @@ Length* StringImpl::toLengthArray(int& len)
         pos = pos2+1;
     }
 
         pos = pos2+1;
     }
 
+    ASSERT(i == len - 1);
+
     /* IE Quirk: If the last comma is the last char skip it and reduce len by one */
     if (str->length()-pos > 0)
         r[i] = parseLength(str->characters() + pos, str->length() - pos);
     /* IE Quirk: If the last comma is the last char skip it and reduce len by one */
     if (str->length()-pos > 0)
         r[i] = parseLength(str->characters() + pos, str->length() - pos);
@@ -809,6 +822,8 @@ PassRefPtr<StringImpl> StringImpl::replace(UChar pattern, StringImpl* replacemen
     srcSegmentLength = m_length - srcSegmentStart;
     memcpy(data.data() + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar));
 
     srcSegmentLength = m_length - srcSegmentStart;
     memcpy(data.data() + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar));
 
+    ASSERT(dstOffset + srcSegmentLength == static_cast<int>(data.size()));
+
     return adopt(data);
 }
 
     return adopt(data);
 }
 
@@ -855,6 +870,8 @@ PassRefPtr<StringImpl> StringImpl::replace(StringImpl* pattern, StringImpl* repl
     srcSegmentLength = m_length - srcSegmentStart;
     memcpy(data.data() + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar));
 
     srcSegmentLength = m_length - srcSegmentStart;
     memcpy(data.data() + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar));
 
+    ASSERT(dstOffset + srcSegmentLength == static_cast<int>(data.size()));
+
     return adopt(data);
 }
 
     return adopt(data);
 }