Przeglądaj źródła

extractbits robustness

Ameer J 3 lat temu
rodzic
commit
d17a51bc59
1 zmienionych plików z 8 dodań i 5 usunięć
  1. 8 5
      src/video_core/host_shaders/astc_decoder.comp

+ 8 - 5
src/video_core/host_shaders/astc_decoder.comp

@@ -349,14 +349,17 @@ uint ExtractBits(uvec4 payload, int offset, int bits) {
     if (bits <= 0) {
         return 0;
     }
-    int last_offset = offset + bits - 1;
-    int shifted_offset = offset >> 5;
+    if (bits > 32) {
+        return 0;
+    }
+    const int last_offset = offset + bits - 1;
+    const int shifted_offset = offset >> 5;
     if ((last_offset >> 5) == shifted_offset) {
         return bitfieldExtract(payload[shifted_offset], offset & 31, bits);
     }
-    int first_bits = 32 - (offset & 31);
-    int result_first = int(bitfieldExtract(payload[shifted_offset], offset & 31, first_bits));
-    int result_second = int(bitfieldExtract(payload[shifted_offset + 1], 0, bits - first_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));
     return result_first | (result_second << first_bits);
 }