Bug 1166082: Check if the lock succeeded before using it. r=bschouten a=lizzard
--- a/gfx/layers/d3d9/CompositorD3D9.cpp
+++ b/gfx/layers/d3d9/CompositorD3D9.cpp
@@ -747,17 +747,21 @@ CompositorD3D9::PaintToTarget()
device()->CreateOffscreenPlainSurface(desc.Width, desc.Height,
D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM,
getter_AddRefs(destSurf), nullptr);
device()->GetRenderTargetData(backBuff, destSurf);
D3DLOCKED_RECT rect;
- destSurf->LockRect(&rect, nullptr, D3DLOCK_READONLY);
+ HRESULT hr = destSurf->LockRect(&rect, nullptr, D3DLOCK_READONLY);
+ if (FAILED(hr) || !rect.pBits) {
+ gfxCriticalError() << "Failed to lock rect in paint to target D3D9 " << hexa(hr);
+ return;
+ }
RefPtr<DataSourceSurface> sourceSurface =
Factory::CreateWrappingDataSourceSurface((uint8_t*)rect.pBits,
rect.Pitch,
IntSize(desc.Width, desc.Height),
SurfaceFormat::B8G8R8A8);
mTarget->CopySurface(sourceSurface,
IntRect(0, 0, desc.Width, desc.Height),
IntPoint(-mTargetBounds.x, -mTargetBounds.y));
--- a/gfx/layers/d3d9/TextureD3D9.cpp
+++ b/gfx/layers/d3d9/TextureD3D9.cpp
@@ -187,19 +187,20 @@ TextureSourceD3D9::InitTextures(DeviceMa
RefPtr<IDirect3DTexture9> tmpTexture =
aDeviceManager->CreateTexture(aSize, aFormat, D3DPOOL_SYSTEMMEM, this);
if (!tmpTexture) {
return nullptr;
}
tmpTexture->GetSurfaceLevel(0, byRef(aSurface));
- aSurface->LockRect(&aLockedRect, nullptr, 0);
- if (!aLockedRect.pBits) {
- NS_WARNING("Could not lock surface");
+
+ HRESULT hr = aSurface->LockRect(&aLockedRect, nullptr, 0);
+ if (FAILED(hr) || !aLockedRect.pBits) {
+ gfxCriticalError() << "Failed to lock rect initialize texture in D3D9 " << hexa(hr);
return nullptr;
}
return result;
}
/**
* Helper method for DataToTexture and SurfaceToTexture.
@@ -702,17 +703,21 @@ CairoTextureClientD3D9::BorrowDrawTarget
mSurface = nullptr;
return nullptr;
}
} else {
// gfxWindowsSurface don't support transparency so we can't use the d3d9
// windows surface optimization.
// Instead we have to use a gfxImageSurface and fallback for font drawing.
D3DLOCKED_RECT rect;
- mD3D9Surface->LockRect(&rect, nullptr, 0);
+ HRESULT hr = mD3D9Surface->LockRect(&rect, nullptr, 0);
+ if (FAILED(hr) || !rect.pBits) {
+ gfxCriticalError() << "Failed to lock rect borrowing the target in D3D9 " << hexa(hr);
+ return nullptr;
+ }
mSurface = new gfxImageSurface((uint8_t*)rect.pBits, mSize,
rect.Pitch, SurfaceFormatToImageFormat(mFormat));
mLockRect = true;
}
mDrawTarget =
gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(mSurface, mSize);