DF-4565 / trigger.c
/* * DF-4565 - radeon_legacy_tv.c flicker-filter index walk (latent OOB) * * radeon_legacy_tv_mode_set() computes flicker_removal from the static * available_tv_modes[] constants and walks SLOPE_limit[] looking for a * match: * * for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) * if (flicker_removal == SLOPE_limit[i]) * break; * ... SLOPE_value[i] * ... <-- i == 5 if nothing matched * * SLOPE_value/YCOEF_value/YCOEF_EN_value/SLOPE_limit are [5]-element * arrays (radeon_legacy_tv.c:269-272). If the loop terminates without a * match, i == 5 and every subsequent use reads one element past the end. * * With the constants currently compiled in this is UNREACHABLE: * flicker_removal = round(ver_total*2*1000/LINES_PER_FRAME + 500)/1000) * over ver_total in {740,706,727,742} and divisors {525,625} yields only * {2,3}, both present in SLOPE_limit = {6,5,4,3,2}. The finding records * the missing bound so a future table edit cannot silently turn a mode * change into a kernel OOB read feeding MMIO register values. * * No hardware PoC is possible on the audit guest (no AMD GPU), and the * defect is not triggerable with the current tables; this is a * hardening/latent-defect record, not a demonstrated impact. */ int main(void) { return 0; } |