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