From 66a25a3d79e6cf0dc095d07353b9767ee5c42575 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 16 Sep 2026 02:33:06 -0400 Subject: [PATCH] Some unvalid checks on astc decoder --- src/video_core/host_shaders/astc_decoder.comp | 11 ++++++++--- src/video_core/texture_cache/util.cpp | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 2248a92a46..58dccb545f 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -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); } diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index e55d0752ec..25cf6e33b1 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp @@ -950,7 +950,7 @@ void ConvertImage(std::span input, const ImageInfo& info, std::span input, const ImageInfo& info, std::span