⬢ DragonFlyBSD Kernel Audit
DF-3741 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/radeon_atombios.c
+++ b/sys/dev/drm/radeon/radeon_atombios.c
@@ -3426,6 +3426,10 @@ static ATOM_VOLTAGE_OBJECT_V3 *atom_lookup_voltage_object_v3(ATOM_VOLTAGE_OBJECT
 		if ((vo->asGpioVoltageObj.sHeader.ucVoltageType == voltage_type) &&
 		    (vo->asGpioVoltageObj.sHeader.ucVoltageMode == voltage_mode))
 			return vo;
-		offset += le16_to_cpu(vo->asGpioVoltageObj.sHeader.usSize);
+		if (le16_to_cpu(vo->asGpioVoltageObj.sHeader.usSize) < 2)
+			break;	/* malformed: avoid infinite loop */
+		offset += le16_to_cpu(vo->asGpioVoltageObj.sHeader.usSize);
 	}
 	return NULL;
 }
@@ -4006,6 +4010,11 @@ int radeon_atom_init_mc_reg_table(struct radeon_device *rdev,
 				ATOM_INIT_REG_INDEX_FORMAT *format = &reg_block->asRegIndexBuf[0];
 				num_entries = (u8)((le16_to_cpu(reg_block->usRegIndexTblSize)) /
 						   sizeof(ATOM_INIT_REG_INDEX_FORMAT)) - 1;
+				if (!le16_to_cpu(reg_block->usRegDataBlkSize)) {
+					DRM_ERROR("Invalid MC reg data block size 0\n");
+					return -EINVAL;
+				}
 				if (num_entries > VBIOS_MC_REGISTER_ARRAY_SIZE)
 					return -EINVAL;