diff options
| author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-01-19 19:54:28 -0500 | 
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-03-13 12:16:03 -0500 | 
| commit | c7553abe894ddac84fe8417a12ec51d5ab60dc58 (patch) | |
| tree | 88935acf2a66ec6e80dcd927f3c1f6bb9f5af229 /src/video_core | |
| parent | 20eb368e147e1c27f05d6923c51596f8dfe24e89 (diff) | |
astc_decoder: Fix out of bounds memory access
resolves a crash with some anamolous textures found in Astral Chain.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/host_shaders/astc_decoder.comp | 12 | 
1 files changed, 10 insertions, 2 deletions
| diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 2ddac2e1d..5be716309 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -339,6 +339,9 @@ uint Select2DPartition(uint seed, uint x, uint y, uint partition_count, bool sma  }  uint ReadBit() { +    if (current_index >= local_buff.length()) { +        return 0; +    }      uint bit = bitfieldExtract(local_buff[current_index], bitsread, 1);      bitsread++;      total_bitsread++; @@ -1170,12 +1173,17 @@ void DecompressBlock(ivec3 coord, uint block_index) {          plane_selector_bits = 2;      }      remaining_bits -= plane_selector_bits; +    if (remaining_bits > 128) { +        // Bad data, more remaining bits than 4 bytes +        // return early +        return; +    }      // Read color data...      uint color_data_bits = remaining_bits;      while (remaining_bits > 0) { -        uint nb = min(remaining_bits, 8); +        int nb = int(min(remaining_bits, 8U));          uint b = StreamBits(nb); -        color_endpoint_data[ced_pointer] = uint(bitfieldExtract(b, 0, 8)); +        color_endpoint_data[ced_pointer] = uint(bitfieldExtract(b, 0, nb));          ced_pointer++;          remaining_bits -= nb;      } | 
