forked from mirrors/linux
		
	pwm: Improve args checking in pwm_apply_state()
It seems like in the process of refactoring pwm_config() to utilize the
newly-introduced pwm_apply_state() API, some args/bounds checking was
dropped.
In particular, I noted that we are now allowing invalid period
selections, e.g.:
  # echo 1 > /sys/class/pwm/pwmchip0/export
  # cat /sys/class/pwm/pwmchip0/pwm1/period
  100
  # echo 101 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle
  [... driver may or may not reject the value, or trigger some logic bug ...]
It's better to see:
  # echo 1 > /sys/class/pwm/pwmchip0/export
  # cat /sys/class/pwm/pwmchip0/pwm1/period
  100
  # echo 101 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle
  -bash: echo: write error: Invalid argument
This patch reintroduces some bounds checks in both pwm_config() (for its
signed parameters; we don't want to convert negative values into large
unsigned values) and in pwm_apply_state() (which fix the above described
behavior, as well as other potential API misuses).
Fixes: 5ec803edcb ("pwm: Add core infrastructure to allow atomic updates")
Signed-off-by: Brian Norris <briannorris@chromium.org>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									1a695a905c
								
							
						
					
					
						commit
						ef2bf4997f
					
				
					 2 changed files with 5 additions and 1 deletions
				
			
		|  | @ -457,7 +457,8 @@ int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state) | |||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	if (!pwm) | ||||
| 	if (!pwm || !state || !state->period || | ||||
| 	    state->duty_cycle > state->period) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (!memcmp(state, &pwm->state, sizeof(*state))) | ||||
|  |  | |||
|  | @ -235,6 +235,9 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns, | |||
| 	if (!pwm) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (duty_ns < 0 || period_ns < 0) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	pwm_get_state(pwm, &state); | ||||
| 	if (state.duty_cycle == duty_ns && state.period == period_ns) | ||||
| 		return 0; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Brian Norris
						Brian Norris