⬢ DragonFlyBSD Kernel Audit
DF-3839 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/evergreen_cs.c
+++ b/sys/dev/drm/radeon/evergreen_cs.c
@@ -2413,9 +2413,12 @@
 				}
 				offset = radeon_get_ib_value(p, idx+1+(i*8)+0);
 				size = radeon_get_ib_value(p, idx+1+(i*8)+1);
-				if (p->rdev && (size + offset) > radeon_bo_size(reloc->robj)) {
+				if (p->rdev &&
+				    ((uint64_t)size + offset) > radeon_bo_size(reloc->robj)) {
 					/* force size to size of the buffer */
 					dev_warn(p->dev, "vbo resource seems too big for the bo\n");
+					if (offset >= radeon_bo_size(reloc->robj))
+						return -EINVAL;
 					ib[idx+1+(i*8)+1] = radeon_bo_size(reloc->robj) - offset;
 				}