]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
leds: qcom-lpg: Check for array overflow when selecting the high resolution
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Feb 2026 14:34:35 +0000 (15:34 +0100)
committerLee Jones <lee@kernel.org>
Tue, 10 Mar 2026 09:23:00 +0000 (09:23 +0000)
When selecting the high resolution values from the array, FIELD_GET() is
used to pull from a 3 bit register, yet the array being indexed has only
5 values in it.  Odds are the hardware is sane, but just to be safe,
properly check before just overflowing and reading random data and then
setting up chip values based on that.

Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://patch.msgid.link/2026021934-nearby-playroom-036b@gregkh
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/rgb/leds-qcom-lpg.c

index 016bf468e094133a83b746041a1bdad297997763..f6061c47f863d654e8b319b86eda3a14ac7e6ce8 100644 (file)
@@ -1273,7 +1273,12 @@ static int lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
                return ret;
 
        if (chan->subtype == LPG_SUBTYPE_HI_RES_PWM) {
-               refclk = lpg_clk_rates_hi_res[FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, val)];
+               unsigned int clk_idx = FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, val);
+
+               if (clk_idx >= ARRAY_SIZE(lpg_clk_rates_hi_res))
+                       return -EINVAL;
+
+               refclk = lpg_clk_rates_hi_res[clk_idx];
                resolution = lpg_pwm_resolution_hi_res[FIELD_GET(PWM_SIZE_HI_RES_MASK, val)];
        } else {
                refclk = lpg_clk_rates[FIELD_GET(PWM_CLK_SELECT_MASK, val)];