--- 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 = ®_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;