DragonFlyBSD Kernel Audit
DF-1178 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/amdgpu/gfx_v9_0.c b/sys/dev/drm/amd/amdgpu/gfx_v9_0.c
--- a/sys/dev/drm/amd/amdgpu/gfx_v9_0.c
+++ b/sys/dev/drm/amd/amdgpu/gfx_v9_0.c
@@ -2093,13 +2093,18 @@
 	int idx;
 
 	for (; indirect_offset < list_size; indirect_offset++) {
-		WARN_ON(*indirect_start_offsets_count >= max_start_offsets_count);
+		if (*indirect_start_offsets_count >= max_start_offsets_count)
+			break;
 		indirect_start_offsets[*indirect_start_offsets_count] = indirect_offset;
 		*indirect_start_offsets_count = *indirect_start_offsets_count + 1;
 
-		while (register_list_format[indirect_offset] != 0xFFFFFFFF) {
+		while (indirect_offset < list_size &&
+		       register_list_format[indirect_offset] != 0xFFFFFFFF) {
 			indirect_offset += 2;
 
+			if (indirect_offset >= list_size)
+				break;
+
 			/* look for the matching indice */
 			for (idx = 0; idx < unique_indirect_reg_count; idx++) {
 				if (unique_indirect_regs[idx] ==
@@ -2108,7 +2113,8 @@
 					break;
 			}
 
-			BUG_ON(idx >= unique_indirect_reg_count);
+			if (idx >= unique_indirect_reg_count)
+				break;
 
 			if (!unique_indirect_regs[idx])
 				unique_indirect_regs[idx] = register_list_format[indirect_offset];