Title: [226931] trunk/Source/WebCore
Revision
226931
Author
[email protected]
Date
2018-01-12 16:46:06 -0800 (Fri, 12 Jan 2018)

Log Message

Unreviewed, rolling out r226927.
https://bugs.webkit.org/show_bug.cgi?id=181621

Breaks 32-bit and iOS release for some reason that i don't
understand yet (Requested by dino on #webkit).

Reverted changeset:

"Use a helper function for checked arithmetic in WebGL
validation"
https://bugs.webkit.org/show_bug.cgi?id=181620
https://trac.webkit.org/changeset/226927

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (226930 => 226931)


--- trunk/Source/WebCore/ChangeLog	2018-01-13 00:45:26 UTC (rev 226930)
+++ trunk/Source/WebCore/ChangeLog	2018-01-13 00:46:06 UTC (rev 226931)
@@ -1,3 +1,18 @@
+2018-01-12  Commit Queue  <[email protected]>
+
+        Unreviewed, rolling out r226927.
+        https://bugs.webkit.org/show_bug.cgi?id=181621
+
+        Breaks 32-bit and iOS release for some reason that i don't
+        understand yet (Requested by dino on #webkit).
+
+        Reverted changeset:
+
+        "Use a helper function for checked arithmetic in WebGL
+        validation"
+        https://bugs.webkit.org/show_bug.cgi?id=181620
+        https://trac.webkit.org/changeset/226927
+
 2018-01-12  Myles C. Maxfield  <[email protected]>
 
         Data URL fonts split in the middle of an alphabet cause random letters to disappear

Modified: trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp (226930 => 226931)


--- trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp	2018-01-13 00:45:26 UTC (rev 226930)
+++ trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp	2018-01-13 00:46:06 UTC (rev 226931)
@@ -1822,11 +1822,11 @@
 
     // The number of required elements is one more than the maximum
     // index that will be accessed.
-    auto checkedNumElementsRequired = checkedAddAndMultiply<unsigned>(maxIndex.value(), 1, 1);
-    if (!checkedNumElementsRequired)
+    Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(maxIndex.value());
+    checkedNumElementsRequired += 1;
+    if (checkedNumElementsRequired.hasOverflowed())
         return false;
-    numElementsRequired = checkedNumElementsRequired.value();
-
+    numElementsRequired = checkedNumElementsRequired.unsafeGet();
     return true;
 }
 

Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (226930 => 226931)


--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp	2018-01-13 00:45:26 UTC (rev 226930)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp	2018-01-13 00:46:06 UTC (rev 226931)
@@ -718,12 +718,13 @@
     if (!maxIndex)
         return false;
 
-    // The number of required elements is one more than the maximum index that will be accessed.
-    auto checkedNumElementsRequired = checkedAddAndMultiply<unsigned>(maxIndex.value(), 1, 1);
-    if (!checkedNumElementsRequired)
+    // The number of required elements is one more than the maximum
+    // index that will be accessed.
+    Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(maxIndex.value());
+    checkedNumElementsRequired += 1;
+    if (checkedNumElementsRequired.hasOverflowed())
         return false;
-    numElementsRequired = checkedNumElementsRequired.value();
-
+    numElementsRequired = checkedNumElementsRequired.unsafeGet();
     return true;
 }
 

Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp (226930 => 226931)


--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp	2018-01-13 00:45:26 UTC (rev 226930)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp	2018-01-13 00:46:06 UTC (rev 226931)
@@ -1843,18 +1843,6 @@
     return true;
 }
 
-template <typename T>
-std::optional<T> WebGLRenderingContextBase::checkedAddAndMultiply(T value, T add, T multiply)
-{
-    Checked<T, RecordOverflow> checkedResult = Checked<T>(value);
-    checkedResult += Checked<T>(add);
-    checkedResult *= Checked<T>(multiply);
-    if (checkedResult.hasOverflowed())
-        return std::nullopt;
-
-    return checkedResult.unsafeGet();
-}
-
 bool WebGLRenderingContextBase::validateIndexArrayPrecise(GC3Dsizei count, GC3Denum type, GC3Dintptr offset, unsigned& numElementsRequired)
 {
     ASSERT(count >= 0 && offset >= 0);
@@ -1904,10 +1892,11 @@
     }
 
     // Then set the last index in the index array and make sure it is valid.
-    auto checkedNumElementsRequired = checkedAddAndMultiply<unsigned>(lastIndex, 1, 1);
-    if (!checkedNumElementsRequired)
+    Checked<unsigned, RecordOverflow> checkedNumElementsRequired = Checked<unsigned>(lastIndex);
+    checkedNumElementsRequired += 1;
+    if (checkedNumElementsRequired.hasOverflowed())
         return false;
-    numElementsRequired = checkedNumElementsRequired.value();
+    numElementsRequired = checkedNumElementsRequired.unsafeGet();
     return true;
 }
 
@@ -2021,7 +2010,9 @@
     }
 
     // Ensure we have a valid rendering state.
-    Checked<GC3Dint, RecordOverflow> checkedSum = Checked<GC3Dint, RecordOverflow>(first) + Checked<GC3Dint, RecordOverflow>(count);
+    Checked<GC3Dint, RecordOverflow> checkedFirst(first);
+    Checked<GC3Dint, RecordOverflow> checkedCount(count);
+    Checked<GC3Dint, RecordOverflow> checkedSum = checkedFirst + checkedCount;
     Checked<GC3Dint, RecordOverflow> checkedPrimitiveCount(primitiveCount);
     if (checkedSum.hasOverflowed() || checkedPrimitiveCount.hasOverflowed() || !validateVertexAttributes(checkedSum.unsafeGet(), checkedPrimitiveCount.unsafeGet())) {
         synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "attempt to access out of bounds arrays");
@@ -5723,11 +5714,12 @@
     if (state.enabled)
         return true;
 
-    auto bufferSize = checkedAddAndMultiply<GC3Duint>(numVertex, 1, 4);
-    if (!bufferSize)
+    Checked<GC3Duint, RecordOverflow> bufferSize(numVertex);
+    bufferSize += 1;
+    bufferSize *= Checked<GC3Duint>(4);
+    if (bufferSize.hasOverflowed())
         return false;
-
-    Checked<GC3Dsizeiptr, RecordOverflow> bufferDataSize(bufferSize.value());
+    Checked<GC3Dsizeiptr, RecordOverflow> bufferDataSize(bufferSize);
     bufferDataSize *= Checked<GC3Dsizeiptr>(sizeof(GC3Dfloat));
     return !bufferDataSize.hasOverflowed() && bufferDataSize.unsafeGet() > 0;
 }
@@ -5748,19 +5740,22 @@
     m_vertexAttrib0UsedBefore = true;
     m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer->object());
 
-    // We know bufferSize and bufferDataSize won't overflow or go negative, thanks to validateSimulatedVertexAttrib0
-    GC3Duint bufferSize = (numVertex + 1) * 4;
-    GC3Dsizeiptr bufferDataSize = bufferSize * sizeof(GC3Dfloat);
+    Checked<GC3Duint> bufferSize(numVertex);
+    bufferSize += 1;
+    bufferSize *= Checked<GC3Duint>(4);
 
-    if (bufferDataSize > m_vertexAttrib0BufferSize) {
+    Checked<GC3Dsizeiptr> bufferDataSize(bufferSize);
+    bufferDataSize *= Checked<GC3Dsizeiptr>(sizeof(GC3Dfloat));
+
+    if (bufferDataSize.unsafeGet() > m_vertexAttrib0BufferSize) {
         m_context->moveErrorsToSyntheticErrorList();
-        m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, bufferDataSize, 0, GraphicsContext3D::DYNAMIC_DRAW);
+        m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, bufferDataSize.unsafeGet(), 0, GraphicsContext3D::DYNAMIC_DRAW);
         if (m_context->getError() != GraphicsContext3D::NO_ERROR) {
             // We were unable to create a buffer.
             m_vertexAttrib0UsedBefore = false;
             return std::nullopt;
         }
-        m_vertexAttrib0BufferSize = bufferDataSize;
+        m_vertexAttrib0BufferSize = bufferDataSize.unsafeGet();
         m_forceAttrib0BufferRefill = true;
     }
 
@@ -5773,7 +5768,7 @@
             || attribValue.value[2] != m_vertexAttrib0BufferValue[2]
             || attribValue.value[3] != m_vertexAttrib0BufferValue[3])) {
 
-        auto bufferData = std::make_unique<GC3Dfloat[]>(bufferSize);
+        auto bufferData = std::make_unique<GC3Dfloat[]>(bufferSize.unsafeGet());
         for (GC3Duint ii = 0; ii < numVertex + 1; ++ii) {
             bufferData[ii * 4] = attribValue.value[0];
             bufferData[ii * 4 + 1] = attribValue.value[1];
@@ -5785,7 +5780,7 @@
         m_vertexAttrib0BufferValue[2] = attribValue.value[2];
         m_vertexAttrib0BufferValue[3] = attribValue.value[3];
         m_forceAttrib0BufferRefill = false;
-        m_context->bufferSubData(GraphicsContext3D::ARRAY_BUFFER, 0, bufferDataSize, bufferData.get());
+        m_context->bufferSubData(GraphicsContext3D::ARRAY_BUFFER, 0, bufferDataSize.unsafeGet(), bufferData.get());
     }
     m_context->vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, 0, 0, 0);
     return true;

Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h (226930 => 226931)


--- trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h	2018-01-13 00:45:26 UTC (rev 226930)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h	2018-01-13 00:46:06 UTC (rev 226931)
@@ -829,8 +829,6 @@
     HTMLCanvasElement* htmlCanvas();
     OffscreenCanvas* offscreenCanvas();
 
-    template <typename T> static std::optional<T> checkedAddAndMultiply(T value, T add, T multiply);
-
 private:
     bool validateArrayBufferType(const char* functionName, GC3Denum type, std::optional<JSC::TypedArrayType>);
     void registerWithWebGLStateTracker();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to