From 5ea8648cd96aca220ea797e049d54562a0235174 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 10 Feb 2019 07:01:01 +0000 Subject: [PATCH] [d3d11, d3d10, dxgi] Handle null ppvObject in QueryInterface. (#909) When a null ppvObject is passed into a QueryInterface on any IUnknown, a E_POINTER should be returned as the result (and it should not crash.) This matches native d3d11/d3d10/dxgi behaviour and the documentation found here https://docs.microsoft.com/en-us/windows/desktop/api/unknwn/nf-unknwn-iunknown-queryinterface(q_) for IUnknown. --- src/d3d10/d3d10_reflection.cpp | 3 +++ src/d3d11/d3d11_blend.cpp | 3 +++ src/d3d11/d3d11_buffer.cpp | 3 +++ src/d3d11/d3d11_class_linkage.cpp | 3 +++ src/d3d11/d3d11_cmdlist.cpp | 3 +++ src/d3d11/d3d11_context.cpp | 3 +++ src/d3d11/d3d11_depth_stencil.cpp | 3 +++ src/d3d11/d3d11_device.cpp | 3 +++ src/d3d11/d3d11_input_layout.cpp | 3 +++ src/d3d11/d3d11_query.cpp | 3 +++ src/d3d11/d3d11_rasterizer.cpp | 3 +++ src/d3d11/d3d11_sampler.cpp | 3 +++ src/d3d11/d3d11_swapchain.cpp | 3 +++ src/d3d11/d3d11_texture.cpp | 9 +++++++++ src/d3d11/d3d11_view_dsv.cpp | 3 +++ src/d3d11/d3d11_view_rtv.cpp | 3 +++ src/d3d11/d3d11_view_srv.cpp | 3 +++ src/d3d11/d3d11_view_uav.cpp | 3 +++ src/dxgi/dxgi_adapter.cpp | 3 +++ src/dxgi/dxgi_factory.cpp | 3 +++ src/dxgi/dxgi_output.cpp | 3 +++ src/dxgi/dxgi_swapchain.cpp | 3 +++ 22 files changed, 72 insertions(+) diff --git a/src/d3d10/d3d10_reflection.cpp b/src/d3d10/d3d10_reflection.cpp index 21df7a90..60108b25 100644 --- a/src/d3d10/d3d10_reflection.cpp +++ b/src/d3d10/d3d10_reflection.cpp @@ -173,6 +173,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D10ShaderReflection::QueryInterface( REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + static const GUID IID_ID3D10ShaderReflection = {0xd40e20b6,0xf8f7,0x42ad,{0xab,0x20,0x4b,0xaf,0x8f,0x15,0xdf,0xaa}}; diff --git a/src/d3d11/d3d11_blend.cpp b/src/d3d11/d3d11_blend.cpp index d83d6616..9e4a2d31 100644 --- a/src/d3d11/d3d11_blend.cpp +++ b/src/d3d11/d3d11_blend.cpp @@ -38,6 +38,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11BlendState::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_buffer.cpp b/src/d3d11/d3d11_buffer.cpp index 28699931..7f3ef0b3 100644 --- a/src/d3d11/d3d11_buffer.cpp +++ b/src/d3d11/d3d11_buffer.cpp @@ -113,6 +113,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Buffer::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_class_linkage.cpp b/src/d3d11/d3d11_class_linkage.cpp index 563fd01b..64ef9e01 100644 --- a/src/d3d11/d3d11_class_linkage.cpp +++ b/src/d3d11/d3d11_class_linkage.cpp @@ -16,6 +16,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11ClassLinkage::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_cmdlist.cpp b/src/d3d11/d3d11_cmdlist.cpp index c49cb3b8..cd8939a5 100644 --- a/src/d3d11/d3d11_cmdlist.cpp +++ b/src/d3d11/d3d11_cmdlist.cpp @@ -16,6 +16,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11CommandList::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index b5b71976..a128182d 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -45,6 +45,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DeviceContext::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_depth_stencil.cpp b/src/d3d11/d3d11_depth_stencil.cpp index 9763df39..7a22807a 100644 --- a/src/d3d11/d3d11_depth_stencil.cpp +++ b/src/d3d11/d3d11_depth_stencil.cpp @@ -22,6 +22,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DepthStencilState::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index f4799bbf..79ed4a48 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1753,6 +1753,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DXGIDevice::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_input_layout.cpp b/src/d3d11/d3d11_input_layout.cpp index b714b1a8..a33be971 100644 --- a/src/d3d11/d3d11_input_layout.cpp +++ b/src/d3d11/d3d11_input_layout.cpp @@ -27,6 +27,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11InputLayout::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_query.cpp b/src/d3d11/d3d11_query.cpp index 61fa6c4c..c3dd8dae 100644 --- a/src/d3d11/d3d11_query.cpp +++ b/src/d3d11/d3d11_query.cpp @@ -78,6 +78,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Query::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_rasterizer.cpp b/src/d3d11/d3d11_rasterizer.cpp index 3eacd3a5..203c93b5 100644 --- a/src/d3d11/d3d11_rasterizer.cpp +++ b/src/d3d11/d3d11_rasterizer.cpp @@ -63,6 +63,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11RasterizerState::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_sampler.cpp b/src/d3d11/d3d11_sampler.cpp index 5be83980..b367eae3 100644 --- a/src/d3d11/d3d11_sampler.cpp +++ b/src/d3d11/d3d11_sampler.cpp @@ -60,6 +60,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11SamplerState::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index c72c9cfe..d80f7dec 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -50,6 +50,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11SwapChain::QueryInterface( REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + InitReturnPtr(ppvObject); if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp index 79af62e5..59987696 100644 --- a/src/d3d11/d3d11_texture.cpp +++ b/src/d3d11/d3d11_texture.cpp @@ -568,6 +568,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture1D::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) @@ -649,6 +652,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture2D::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) @@ -732,6 +738,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture3D::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_view_dsv.cpp b/src/d3d11/d3d11_view_dsv.cpp index d53bb05a..9c79e0a7 100644 --- a/src/d3d11/d3d11_view_dsv.cpp +++ b/src/d3d11/d3d11_view_dsv.cpp @@ -90,6 +90,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DepthStencilView::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_view_rtv.cpp b/src/d3d11/d3d11_view_rtv.cpp index 5b078727..c182117b 100644 --- a/src/d3d11/d3d11_view_rtv.cpp +++ b/src/d3d11/d3d11_view_rtv.cpp @@ -102,6 +102,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11RenderTargetView::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_view_srv.cpp b/src/d3d11/d3d11_view_srv.cpp index dcd14a12..0c9b7959 100644 --- a/src/d3d11/d3d11_view_srv.cpp +++ b/src/d3d11/d3d11_view_srv.cpp @@ -167,6 +167,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11ShaderResourceView::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/d3d11/d3d11_view_uav.cpp b/src/d3d11/d3d11_view_uav.cpp index 2f5d1355..097337bd 100644 --- a/src/d3d11/d3d11_view_uav.cpp +++ b/src/d3d11/d3d11_view_uav.cpp @@ -114,6 +114,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11UnorderedAccessView::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 87acb067..5b90f65e 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -27,6 +27,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiAdapter::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/dxgi/dxgi_factory.cpp b/src/dxgi/dxgi_factory.cpp index e6e681ed..39bf5704 100644 --- a/src/dxgi/dxgi_factory.cpp +++ b/src/dxgi/dxgi_factory.cpp @@ -18,6 +18,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiFactory::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/dxgi/dxgi_output.cpp b/src/dxgi/dxgi_output.cpp index 4faf2b78..3bcf4bd0 100644 --- a/src/dxgi/dxgi_output.cpp +++ b/src/dxgi/dxgi_output.cpp @@ -41,6 +41,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiOutput::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown) diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index a0a20d93..3c94edb9 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -48,6 +48,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiSwapChain::QueryInterface(REFIID riid, void** ppvObject) { + if (ppvObject == nullptr) + return E_POINTER; + *ppvObject = nullptr; if (riid == __uuidof(IUnknown)