diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index 7f21101..16efde6 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -115,6 +115,9 @@ namespace DirectX CP_FLAGS_8BPP = 0x40000, // Override with a legacy 8 bits-per-pixel format size + + CP_FLAGS_LIMIT_4GB = 0x10000000, + // Don't allow pixel allocations in excess of 4GB (always true for 32-bit) }; HRESULT __cdecl ComputePitch( diff --git a/DirectXTex/DirectXTexHDR.cpp b/DirectXTex/DirectXTexHDR.cpp index bdb3191..4a64dd0 100644 --- a/DirectXTex/DirectXTexHDR.cpp +++ b/DirectXTex/DirectXTexHDR.cpp @@ -715,7 +715,7 @@ HRESULT DirectX::LoadFromHDRMemory(const void* pSource, size_t size, TexMetadata if (remaining == 0) return E_FAIL; - hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1); + hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1, CP_FLAGS_LIMIT_4GB); if (FAILED(hr)) return hr; diff --git a/DirectXTex/DirectXTexImage.cpp b/DirectXTex/DirectXTexImage.cpp index 678a969..d2c7d40 100644 --- a/DirectXTex/DirectXTexImage.cpp +++ b/DirectXTex/DirectXTexImage.cpp @@ -123,6 +123,12 @@ HRESULT DirectX::Internal::DetermineImageArray( } #else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); + + if ((cpFlags & CP_FLAGS_LIMIT_4GB) && (totalPixelSize > UINT32_MAX)) + { + nImages = pixelSize = 0; + return HRESULT_E_ARITHMETIC_OVERFLOW; + } #endif nImages = nimages; diff --git a/DirectXTex/DirectXTexTGA.cpp b/DirectXTex/DirectXTexTGA.cpp index 724d324..047ffdf 100644 --- a/DirectXTex/DirectXTexTGA.cpp +++ b/DirectXTex/DirectXTexTGA.cpp @@ -1683,7 +1683,7 @@ HRESULT DirectX::LoadFromTGAMemory( const void* pPixels = static_cast(pSource) + offset + paletteOffset; - hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1); + hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1, CP_FLAGS_LIMIT_4GB); if (FAILED(hr)) return hr; @@ -1856,7 +1856,7 @@ HRESULT DirectX::LoadFromTGAFile( #endif } - hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1); + hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1, CP_FLAGS_LIMIT_4GB); if (FAILED(hr)) return hr;