CodeQL recommendations (#580)

This commit is contained in:
Chuck Walbourn 2025-02-11 17:04:57 -08:00 committed by GitHub
parent cfd5f27126
commit 3e8137e481
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 99 additions and 47 deletions

View File

@ -32,7 +32,9 @@ namespace
const uint8_t* sptr = xbox.GetPointer(); const uint8_t* sptr = xbox.GetPointer();
const uint8_t* endPtr = sptr + layout.SizeBytes; const uint8_t* endPtr = sptr + layout.SizeBytes;
for (uint32_t item = 0; item < nimages; ++item) assert((nimages > 0) && (nimages <= UINT32_MAX));
for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = result[item]; const Image* img = result[item];
if (!img || !img->pixels) if (!img || !img->pixels)
@ -49,9 +51,9 @@ namespace
{ {
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
const UINT64 element = (packed) ? (x >> 1) : x; const UINT64 element = (packed) ? (x >> 1) : x;
const size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, item, 0, nullptr); const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast<uint32_t>(level), element, 0, static_cast<uint32_t>(item), 0, nullptr);
#else #else
const size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast<uint32_t>(level), x, 0, static_cast<uint32_t>(item), 0);
#endif #endif
if (offset == size_t(-1)) if (offset == size_t(-1))
return E_FAIL; return E_FAIL;
@ -83,7 +85,7 @@ namespace
_In_reads_(nimages) const Image** result, _In_reads_(nimages) const Image** result,
size_t nimages) size_t nimages)
{ {
if (!nimages) if (!nimages || nimages > UINT32_MAX)
return E_INVALIDARG; return E_INVALIDARG;
if (!xbox.GetPointer() || !computer || !result || !result[0]) if (!xbox.GetPointer() || !computer || !result || !result[0])
@ -150,7 +152,7 @@ namespace
return E_FAIL; return E_FAIL;
// Perform detiling // Perform detiling
for (uint32_t item = 0; item < nimages; ++item) for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = result[item]; const Image* img = result[item];
if (!img || !img->pixels) if (!img || !img->pixels)
@ -164,9 +166,9 @@ namespace
for (size_t x = 0; x < img->width; ++x) for (size_t x = 0; x < img->width; ++x)
{ {
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0, nullptr); size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast<uint32_t>(item), 0, nullptr);
#else #else
size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast<uint32_t>(item), 0);
#endif #endif
if (offset == size_t(-1)) if (offset == size_t(-1))
return E_FAIL; return E_FAIL;
@ -199,7 +201,7 @@ namespace
_In_reads_(nimages) const Image** result, _In_reads_(nimages) const Image** result,
size_t nimages) size_t nimages)
{ {
if (!nimages) if (!nimages || nimages > UINT32_MAX)
return E_INVALIDARG; return E_INVALIDARG;
if (!xbox.GetPointer() || !computer || !result || !result[0]) if (!xbox.GetPointer() || !computer || !result || !result[0])
@ -210,7 +212,7 @@ namespace
uint8_t* baseAddr = xbox.GetPointer(); uint8_t* baseAddr = xbox.GetPointer();
const auto& metadata = xbox.GetMetadata(); const auto& metadata = xbox.GetMetadata();
for (uint32_t item = 0; item < nimages; ++item) for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = result[item]; const Image* img = result[item];
if (!img || !img->pixels) if (!img || !img->pixels)
@ -314,6 +316,11 @@ HRESULT Xbox::Detile(
{ {
case TEX_DIMENSION_TEXTURE1D: case TEX_DIMENSION_TEXTURE1D:
{ {
if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
return E_INVALIDARG;
XG_TEXTURE1D_DESC desc = {}; XG_TEXTURE1D_DESC desc = {};
desc.Width = static_cast<UINT>(metadata.width); desc.Width = static_cast<UINT>(metadata.width);
desc.MipLevels = static_cast<UINT>(metadata.mipLevels); desc.MipLevels = static_cast<UINT>(metadata.mipLevels);
@ -348,13 +355,13 @@ HRESULT Xbox::Detile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if (metadata.arraySize > 1) if (metadata.arraySize > 1)
{ {
std::vector<const Image*> images; std::vector<const Image*> images;
images.reserve(metadata.arraySize); images.reserve(metadata.arraySize);
for (uint32_t item = 0; item < metadata.arraySize; ++item) for (size_t item = 0; item < metadata.arraySize; ++item)
{ {
const Image* img = image.GetImage(level, item, 0); const Image* img = image.GetImage(level, item, 0);
if (!img) if (!img)
@ -366,7 +373,7 @@ HRESULT Xbox::Detile(
images.push_back(img); images.push_back(img);
} }
hr = Detile1D(xbox, level, computer.Get(), layout, &images[0], images.size()); hr = Detile1D(xbox, static_cast<uint32_t>(level), computer.Get(), layout, &images[0], images.size());
} }
else else
{ {
@ -377,7 +384,7 @@ HRESULT Xbox::Detile(
return E_FAIL; return E_FAIL;
} }
hr = Detile1D(xbox, level, computer.Get(), layout, &img, 1); hr = Detile1D(xbox, static_cast<uint32_t>(level), computer.Get(), layout, &img, 1);
} }
if (FAILED(hr)) if (FAILED(hr))
@ -391,6 +398,12 @@ HRESULT Xbox::Detile(
case TEX_DIMENSION_TEXTURE2D: case TEX_DIMENSION_TEXTURE2D:
{ {
if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
return E_INVALIDARG;
XG_TEXTURE2D_DESC desc = {}; XG_TEXTURE2D_DESC desc = {};
desc.Width = static_cast<UINT>(metadata.width); desc.Width = static_cast<UINT>(metadata.width);
desc.Height = static_cast<UINT>(metadata.height); desc.Height = static_cast<UINT>(metadata.height);
@ -427,13 +440,13 @@ HRESULT Xbox::Detile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if (metadata.arraySize > 1) if (metadata.arraySize > 1)
{ {
std::vector<const Image*> images; std::vector<const Image*> images;
images.reserve(metadata.arraySize); images.reserve(metadata.arraySize);
for (uint32_t item = 0; item < metadata.arraySize; ++item) for (size_t item = 0; item < metadata.arraySize; ++item)
{ {
const Image* img = image.GetImage(level, item, 0); const Image* img = image.GetImage(level, item, 0);
if (!img) if (!img)
@ -445,7 +458,7 @@ HRESULT Xbox::Detile(
images.push_back(img); images.push_back(img);
} }
hr = Detile2D(xbox, level, computer.Get(), &images[0], images.size()); hr = Detile2D(xbox, static_cast<uint32_t>(level), computer.Get(), &images[0], images.size());
} }
else else
{ {
@ -456,7 +469,7 @@ HRESULT Xbox::Detile(
return E_FAIL; return E_FAIL;
} }
hr = Detile2D(xbox, level, computer.Get(), &img, 1); hr = Detile2D(xbox, static_cast<uint32_t>(level), computer.Get(), &img, 1);
} }
if (FAILED(hr)) if (FAILED(hr))
@ -470,6 +483,13 @@ HRESULT Xbox::Detile(
case TEX_DIMENSION_TEXTURE3D: case TEX_DIMENSION_TEXTURE3D:
{ {
if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize != 1)
return E_INVALIDARG;
XG_TEXTURE3D_DESC desc = {}; XG_TEXTURE3D_DESC desc = {};
desc.Width = static_cast<UINT>(metadata.width); desc.Width = static_cast<UINT>(metadata.width);
desc.Height = static_cast<UINT>(metadata.height); desc.Height = static_cast<UINT>(metadata.height);
@ -504,10 +524,10 @@ HRESULT Xbox::Detile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
uint32_t d = static_cast<uint32_t>(metadata.depth); auto d = static_cast<uint32_t>(metadata.depth);
size_t index = 0; size_t index = 0;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if ((index + d) > image.GetImageCount()) if ((index + d) > image.GetImageCount())
{ {
@ -516,7 +536,7 @@ HRESULT Xbox::Detile(
} }
// Relies on the fact that slices are contiguous // Relies on the fact that slices are contiguous
hr = Detile3D(xbox, level, computer.Get(), image.GetImages()[index]); hr = Detile3D(xbox, static_cast<uint32_t>(level), computer.Get(), image.GetImages()[index]);
if (FAILED(hr)) if (FAILED(hr))
{ {
image.Release(); image.Release();

View File

@ -34,7 +34,7 @@ namespace
uint8_t* dptr = xbox.GetPointer(); uint8_t* dptr = xbox.GetPointer();
const uint8_t* endPtr = dptr + layout.SizeBytes; const uint8_t* endPtr = dptr + layout.SizeBytes;
for (uint32_t item = 0; item < nimages; ++item) for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = images[item]; const Image* img = images[item];
@ -52,9 +52,9 @@ namespace
{ {
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
UINT64 element = (packed) ? (x >> 1) : x; UINT64 element = (packed) ? (x >> 1) : x;
size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, item, 0, nullptr); size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, static_cast<uint32_t>(item), 0, nullptr);
#else #else
size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast<uint32_t>(item), 0);
#endif #endif
if (offset == size_t(-1)) if (offset == size_t(-1))
return E_FAIL; return E_FAIL;
@ -169,7 +169,7 @@ namespace
const XG_RESOURCE_LAYOUT& layout, const XG_RESOURCE_LAYOUT& layout,
const XboxImage& xbox) const XboxImage& xbox)
{ {
if (!nimages) if (!nimages || nimages > UINT32_MAX)
return E_INVALIDARG; return E_INVALIDARG;
if (!images || !images[0] || !computer || !xbox.GetPointer()) if (!images || !images[0] || !computer || !xbox.GetPointer())
@ -230,7 +230,7 @@ namespace
memset(tiled, 0, sizeof(XMVECTOR) * tiledPixels); memset(tiled, 0, sizeof(XMVECTOR) * tiledPixels);
// Perform tiling // Perform tiling
for (uint32_t item = 0; item < nimages; ++item) for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = images[item]; const Image* img = images[item];
@ -248,9 +248,9 @@ namespace
for (size_t x = 0; x < img->width; ++x) for (size_t x = 0; x < img->width; ++x)
{ {
#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT)
size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0, nullptr); size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast<uint32_t>(item), 0, nullptr);
#else #else
size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast<uint32_t>(item), 0);
#endif #endif
if (offset == size_t(-1)) if (offset == size_t(-1))
return E_FAIL; return E_FAIL;
@ -285,7 +285,7 @@ namespace
_In_ XGTextureAddressComputer* computer, _In_ XGTextureAddressComputer* computer,
const XboxImage& xbox) const XboxImage& xbox)
{ {
if (!nimages) if (!nimages || nimages > UINT32_MAX)
return E_INVALIDARG; return E_INVALIDARG;
if (!images || !images[0] || !computer || !xbox.GetPointer()) if (!images || !images[0] || !computer || !xbox.GetPointer())
@ -294,7 +294,7 @@ namespace
uint8_t* baseAddr = xbox.GetPointer(); uint8_t* baseAddr = xbox.GetPointer();
const auto& metadata = xbox.GetMetadata(); const auto& metadata = xbox.GetMetadata();
for (uint32_t item = 0; item < nimages; ++item) for (size_t item = 0; item < nimages; ++item)
{ {
const Image* img = images[item]; const Image* img = images[item];
@ -444,15 +444,39 @@ HRESULT Xbox::Tile(
XboxImage& xbox, XboxImage& xbox,
XboxTileMode mode) XboxTileMode mode)
{ {
if (!srcImages if (!srcImages || !nimages || nimages > UINT32_MAX)
|| !nimages
|| metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS)
return E_INVALIDARG; return E_INVALIDARG;
switch (metadata.dimension)
{
case TEX_DIMENSION_TEXTURE1D:
if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
return E_INVALIDARG;
break;
case TEX_DIMENSION_TEXTURE2D:
if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
return E_INVALIDARG;
break;
case TEX_DIMENSION_TEXTURE3D:
if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION
|| metadata.mipLevels > D3D11_REQ_MIP_LEVELS
|| metadata.arraySize != 1)
return E_INVALIDARG;
break;
default:
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
}
xbox.Release(); xbox.Release();
if (metadata.format == DXGI_FORMAT_R1_UNORM if (metadata.format == DXGI_FORMAT_R1_UNORM
@ -533,13 +557,13 @@ HRESULT Xbox::Tile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if (metadata.arraySize > 1) if (metadata.arraySize > 1)
{ {
std::vector<const Image*> images; std::vector<const Image*> images;
images.reserve(metadata.arraySize); images.reserve(metadata.arraySize);
for (uint32_t item = 0; item < metadata.arraySize; ++item) for (size_t item = 0; item < metadata.arraySize; ++item)
{ {
const size_t index = metadata.ComputeIndex(level, item, 0); const size_t index = metadata.ComputeIndex(level, item, 0);
if (index >= nimages) if (index >= nimages)
@ -551,7 +575,7 @@ HRESULT Xbox::Tile(
images.push_back(&srcImages[index]); images.push_back(&srcImages[index]);
} }
hr = Tile1D(&images[0], images.size(), level, computer.Get(), layout, xbox); hr = Tile1D(&images[0], images.size(), static_cast<uint32_t>(level), computer.Get(), layout, xbox);
} }
else else
{ {
@ -563,7 +587,7 @@ HRESULT Xbox::Tile(
} }
const Image* images = &srcImages[index]; const Image* images = &srcImages[index];
hr = Tile1D(&images, 1, level, computer.Get(), layout, xbox); hr = Tile1D(&images, 1, static_cast<uint32_t>(level), computer.Get(), layout, xbox);
} }
if (FAILED(hr)) if (FAILED(hr))
@ -617,13 +641,13 @@ HRESULT Xbox::Tile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if (metadata.arraySize > 1) if (metadata.arraySize > 1)
{ {
std::vector<const Image*> images; std::vector<const Image*> images;
images.reserve(metadata.arraySize); images.reserve(metadata.arraySize);
for (uint32_t item = 0; item < metadata.arraySize; ++item) for (size_t item = 0; item < metadata.arraySize; ++item)
{ {
const size_t index = metadata.ComputeIndex(level, item, 0); const size_t index = metadata.ComputeIndex(level, item, 0);
if (index >= nimages) if (index >= nimages)
@ -635,7 +659,7 @@ HRESULT Xbox::Tile(
images.push_back(&srcImages[index]); images.push_back(&srcImages[index]);
} }
hr = Tile2D(&images[0], images.size(), level, computer.Get(), xbox); hr = Tile2D(&images[0], images.size(), static_cast<uint32_t>(level), computer.Get(), xbox);
} }
else else
{ {
@ -647,7 +671,7 @@ HRESULT Xbox::Tile(
} }
const Image* images = &srcImages[index]; const Image* images = &srcImages[index];
hr = Tile2D(&images, 1, level, computer.Get(), xbox); hr = Tile2D(&images, 1, static_cast<uint32_t>(level), computer.Get(), xbox);
} }
if (FAILED(hr)) if (FAILED(hr))
@ -699,10 +723,10 @@ HRESULT Xbox::Tile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
uint32_t d = static_cast<uint32_t>(metadata.depth); auto d = static_cast<uint32_t>(metadata.depth);
size_t index = 0; size_t index = 0;
for (uint32_t level = 0; level < metadata.mipLevels; ++level) for (size_t level = 0; level < metadata.mipLevels; ++level)
{ {
if ((index + d) > nimages) if ((index + d) > nimages)
{ {
@ -711,7 +735,7 @@ HRESULT Xbox::Tile(
} }
// Relies on the fact that slices are contiguous // Relies on the fact that slices are contiguous
hr = Tile3D(srcImages[index], level, computer.Get(), xbox); hr = Tile3D(srcImages[index], static_cast<uint32_t>(level), computer.Get(), xbox);
if (FAILED(hr)) if (FAILED(hr))
{ {
xbox.Release(); xbox.Release();

View File

@ -25,6 +25,7 @@ pr:
- build/*.in - build/*.in
- build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml - build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml
- DirectXTex/Shaders/CompileShaders.cmd - DirectXTex/Shaders/CompileShaders.cmd
- Auxiliary/*Xbox*
resources: resources:
repositories: repositories:

View File

@ -26,6 +26,7 @@ pr:
- build/*.cmake - build/*.cmake
- build/SetupBWOI.* - build/SetupBWOI.*
- DirectXTex/Shaders/CompileShaders.cmd - DirectXTex/Shaders/CompileShaders.cmd
- Auxiliary/*Xbox*
resources: resources:
repositories: repositories:

View File

@ -24,6 +24,9 @@ pr:
- build/*.cmake - build/*.cmake
- build/*.in - build/*.in
- build/DirectXTex-GitHub-WSL-11.yml - build/DirectXTex-GitHub-WSL-11.yml
- Auxiliary/*EXR*
- Auxiliary/*JPEG*
- Auxiliary/*PNG*
resources: resources:
repositories: repositories:

View File

@ -24,6 +24,9 @@ pr:
- build/*.cmake - build/*.cmake
- build/*.in - build/*.in
- build/DirectXTex-GitHub-WSL-13.yml - build/DirectXTex-GitHub-WSL-13.yml
- Auxiliary/*EXR*
- Auxiliary/*JPEG*
- Auxiliary/*PNG*
resources: resources:
repositories: repositories: