URL percent-encode operations should use checked arithmetic for buffer allocation...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Feb 2019 01:36:04 +0000 (01:36 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Feb 2019 01:36:04 +0000 (01:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=194877
<rdar://problem/48212062>

Patch by Alex Christensen <achristensen@webkit.org> on 2019-02-20
Reviewed by Tim Horton.

* wtf/URLHelpers.cpp:
(WTF::URLHelpers::userVisibleURL):
* wtf/cocoa/NSURLExtras.mm:
(WTF::dataWithUserTypedString):

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

Source/WTF/ChangeLog
Source/WTF/wtf/URLHelpers.cpp
Source/WTF/wtf/cocoa/NSURLExtras.mm

index 3525506..3020dcf 100644 (file)
@@ -1,3 +1,16 @@
+2019-02-20  Alex Christensen  <achristensen@webkit.org>
+
+        URL percent-encode operations should use checked arithmetic for buffer allocation length
+        https://bugs.webkit.org/show_bug.cgi?id=194877
+        <rdar://problem/48212062>
+
+        Reviewed by Tim Horton.
+
+        * wtf/URLHelpers.cpp:
+        (WTF::URLHelpers::userVisibleURL):
+        * wtf/cocoa/NSURLExtras.mm:
+        (WTF::dataWithUserTypedString):
+
 2019-02-20  Dean Jackson  <dino@apple.com>
 
         Rotation animations sometimes use the wrong origin (affects apple.com)
index 0eaf85e..c69ca38 100644 (file)
@@ -808,9 +808,11 @@ String userVisibleURL(const CString& url)
 
     bool mayNeedHostNameDecoding = false;
 
-    // The buffer should be large enough to %-escape every character.
-    int bufferLength = (length * 3) + 1;
-    Vector<char, urlBytesBufferLength> after(bufferLength);
+    Checked<int, RecordOverflow> bufferLength = length;
+    bufferLength = bufferLength * 3 + 1; // The buffer should be large enough to %-escape every character.
+    if (bufferLength.hasOverflowed())
+        return { };
+    Vector<char, urlBytesBufferLength> after(bufferLength.unsafeGet());
 
     char* q = after.data();
     {
@@ -850,7 +852,7 @@ String userVisibleURL(const CString& url)
         // then we will copy back bytes to the start of the buffer 
         // as we convert.
         int afterlength = q - after.data();
-        char* p = after.data() + bufferLength - afterlength - 1;
+        char* p = after.data() + bufferLength.unsafeGet() - afterlength - 1;
         memmove(p, after.data(), afterlength + 1); // copies trailing '\0'
         char* q = after.data();
         while (*p) {
index 56f1f3d..3a4fca9 100644 (file)
@@ -194,8 +194,13 @@ static NSData *dataWithUserTypedString(NSString *string)
     int inLength = [userTypedData length];
     if (!inLength)
         return nil;
+
+    Checked<int, RecordOverflow> mallocLength = inLength;
+    mallocLength *= 3; // large enough to %-escape every character
+    if (mallocLength.hasOverflowed())
+        return nil;
     
-    char* outBytes = static_cast<char *>(malloc(inLength * 3)); // large enough to %-escape every character
+    char* outBytes = static_cast<char *>(malloc(mallocLength.unsafeGet()));
     char* p = outBytes;
     int outLength = 0;
     for (int i = 0; i < inLength; i++) {