Bug 1412554 - Return GL_OOM if memory counter in ResourceManager11 overflow draft
authorChih-Yi Leu <subsevenx2001@gmail.com>
Wed, 08 Nov 2017 10:36:18 +0800
changeset 696741 03c6ff933ce8082dd99c87959acae93343388d46
parent 696686 933f9cd9b3b9030399a11c19cb4e5117b29e2772
child 739911 1456a65356aa5490f8dddd828994ac520df9b2ed
push id88774
push userbmo:cleu@mozilla.com
push dateSat, 11 Nov 2017 03:36:56 +0000
bugs1412554
milestone58.0a1
Bug 1412554 - Return GL_OOM if memory counter in ResourceManager11 overflow MozReview-Commit-ID: AgDd95NlNZq
gfx/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
--- a/gfx/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
+++ b/gfx/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
@@ -355,16 +355,26 @@ gl::Error ResourceManager11::allocate(Re
     T *resource          = nullptr;
 
     GetInitDataFromD3D11<T> *shadowInitData = initData;
     if (!shadowInitData && renderer->isRobustResourceInitEnabled())
     {
         shadowInitData = createInitDataIfNeeded<T>(desc);
     }
 
+    // In Windows 32-bit, it's possible that mAllocatedResourceDeviceMemory
+    // exceeds UINT32_MAX leading to a delayed crash when we release
+    // the context, we should prevent that happen
+    const auto resourceSize = ComputeMemoryUsage(desc);
+    if (mAllocatedResourceDeviceMemory[ResourceTypeIndex<T>()] >
+        mAllocatedResourceDeviceMemory[ResourceTypeIndex<T>()] +
+        resourceSize) {
+        return gl::OutOfMemory() << "Error: Internal Memory Counter overflow";
+    }
+
     HRESULT hr = CreateResource(device, desc, shadowInitData, &resource);
     if (FAILED(hr))
     {
         ASSERT(!resource);
         if (d3d11::isDeviceLostError(hr))
         {
             renderer->notifyDeviceLost();
         }
@@ -374,24 +384,26 @@ gl::Error ResourceManager11::allocate(Re
     }
 
     if (!shadowInitData && renderer->isRobustResourceInitEnabled())
     {
         ANGLE_TRY(ClearResource(renderer, desc, resource));
     }
 
     ASSERT(resource);
-    incrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(desc));
+    incrResource(GetResourceTypeFromD3D11<T>(), resourceSize);
     *resourceOut = std::move(Resource11<T>(resource, this));
     return gl::NoError();
 }
 
 void ResourceManager11::incrResource(ResourceType resourceType, size_t memorySize)
 {
     mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]++;
+    ASSERT(mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] + memorySize >=
+           mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)]);
     mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] += memorySize;
 }
 
 void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySize)
 {
     ASSERT(mAllocatedResourceCounts[ResourceTypeIndex(resourceType)] > 0);
     mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]--;
     ASSERT(mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] >= memorySize);