pwm: Zero-initialize the pwm_state passed to driver's .get_state()
This is just to ensure that .usage_power is properly initialized and doesn't contain random stack data. The other members of struct pwm_state should get a value assigned in a successful call to .get_state(). So in the absence of bugs in driver implementations, this is only a safe-guard and no fix. Reported-by: Munehisa Kamata <kamatam@amazon.com> Link: https://lore.kernel.org/r/20230310214004.2619480-1-u.kleine-koenig@pengutronix.de Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
8caa81eb95
commit
1271a7b98e
|
@ -115,7 +115,14 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pwm->chip->ops->get_state) {
|
if (pwm->chip->ops->get_state) {
|
||||||
struct pwm_state state;
|
/*
|
||||||
|
* Zero-initialize state because most drivers are unaware of
|
||||||
|
* .usage_power. The other members of state are supposed to be
|
||||||
|
* set by lowlevel drivers. We still initialize the whole
|
||||||
|
* structure for simplicity even though this might paper over
|
||||||
|
* faulty implementations of .get_state().
|
||||||
|
*/
|
||||||
|
struct pwm_state state = { 0, };
|
||||||
|
|
||||||
err = pwm->chip->ops->get_state(pwm->chip, pwm, &state);
|
err = pwm->chip->ops->get_state(pwm->chip, pwm, &state);
|
||||||
trace_pwm_get(pwm, &state, err);
|
trace_pwm_get(pwm, &state, err);
|
||||||
|
@ -448,7 +455,7 @@ static void pwm_apply_state_debug(struct pwm_device *pwm,
|
||||||
{
|
{
|
||||||
struct pwm_state *last = &pwm->last;
|
struct pwm_state *last = &pwm->last;
|
||||||
struct pwm_chip *chip = pwm->chip;
|
struct pwm_chip *chip = pwm->chip;
|
||||||
struct pwm_state s1, s2;
|
struct pwm_state s1 = { 0 }, s2 = { 0 };
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_PWM_DEBUG))
|
if (!IS_ENABLED(CONFIG_PWM_DEBUG))
|
||||||
|
@ -530,6 +537,7 @@ static void pwm_apply_state_debug(struct pwm_device *pwm,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*last = (struct pwm_state){ 0 };
|
||||||
err = chip->ops->get_state(chip, pwm, last);
|
err = chip->ops->get_state(chip, pwm, last);
|
||||||
trace_pwm_get(pwm, last, err);
|
trace_pwm_get(pwm, last, err);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
Loading…
Reference in New Issue