Commit 1271a7b9 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Thierry Reding

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: default avatarMunehisa Kamata <kamatam@amazon.com>
Link: https://lore.kernel.org/r/20230310214004.2619480-1-u.kleine-koenig@pengutronix.deSigned-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent 8caa81eb
...@@ -115,7 +115,14 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label) ...@@ -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, ...@@ -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, ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment