Some unvalid checks on astc decoder

This commit is contained in:
CamilleLaVey
2026-09-16 02:33:06 -04:00
parent b24c3d7226
commit 66a25a3d79
2 changed files with 10 additions and 5 deletions
@@ -296,14 +296,19 @@ uint ExtractBits(uvec4 payload, int offset, int bits) {
if (bits > 32) {
return 0;
}
const int last_offset = offset + bits - 1;
if (offset >= 128) {
return 0;
}
const int avail_bits = min(bits, 128 - offset);
const int last_offset = offset + avail_bits - 1;
const int shifted_offset = offset >> 5;
if ((last_offset >> 5) == shifted_offset) {
return bitfieldExtract(payload[shifted_offset], offset & 31, bits);
return bitfieldExtract(payload[shifted_offset], offset & 31, avail_bits);
}
const int first_bits = 32 - (offset & 31);
const int result_first = int(bitfieldExtract(payload[shifted_offset], offset & 31, first_bits));
const int result_second = int(bitfieldExtract(payload[shifted_offset + 1], 0, bits - first_bits));
const int result_second =
int(bitfieldExtract(payload[shifted_offset + 1], 0, avail_bits - first_bits));
return result_first | (result_second << first_bits);
}
+2 -2
View File
@@ -950,7 +950,7 @@ void ConvertImage(std::span<const u8> input, const ImageInfo& info, std::span<u8
tile_size.height, output.subspan(output_offset));
output_offset += copy.image_extent.width * copy.image_extent.height *
copy.image_subresource.num_layers *
copy.image_extent.depth * copy.image_subresource.num_layers *
BytesPerBlock(PixelFormat::A8B8G8R8_UNORM);
} else if (astc) {
// BC1 uses 0.5 bytes per texel
@@ -985,7 +985,7 @@ void ConvertImage(std::span<const u8> input, const ImageInfo& info, std::span<u8
} else {
DecompressBCn(input_offset, output.subspan(output_offset), copy, info.format);
output_offset += copy.image_extent.width * copy.image_extent.height *
copy.image_subresource.num_layers *
copy.image_extent.depth * copy.image_subresource.num_layers *
ConvertedBytesPerBlock(info.format);
}