Prevent integer-overflow on scissor test

Currently we don't restrict any of the parameters (x, y, width, height)
to glScissor aside from forcing width and height to be non-negative.
This means large parameters can cause overflows during the scissor test.

So we change width/height in the cases where an overflow will happen.

Bug chromium:969071

Change-Id: Icb6992551aed6e3e086f96d89931eae0e99899a4
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/32608
Presubmit-Ready: Sean Risser <srisser@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Sean Risser <srisser@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 787b6d6..f5db001 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -694,6 +694,20 @@
 {
 	mState.scissorX = x;
 	mState.scissorY = y;
+
+	// An overflow happens when (infinite precision) X + Width > INT32_MAX. We
+	// can change that formula to "X > INT32_MAX - Width". And when we bring it
+	// down to 32-bit precision, we know it's safe because width is non-negative.
+	if (x > INT32_MAX - width)
+	{
+		width = INT32_MAX - x;
+	}
+
+	if (y > INT32_MAX - height)
+	{
+		height = INT32_MAX - y;
+	}
+
 	mState.scissorWidth = width;
 	mState.scissorHeight = height;
 }