diff options
author | Luiz Otavio O Souza <loos@FreeBSD.org> | 2015-09-07 21:59:11 +0000 |
---|---|---|
committer | Luiz Otavio O Souza <loos@FreeBSD.org> | 2015-09-07 21:59:11 +0000 |
commit | c80b6ca937d436f3acc02784343964400fc7deff (patch) | |
tree | 6ddf35d2e64a006c692861b0c798cca57afcebdc /sys/dev | |
parent | 1c292cd806c6f0e5f7df2038583d3ea0f559f9f0 (diff) | |
download | src-c80b6ca937d436f3acc02784343964400fc7deff.tar.gz src-c80b6ca937d436f3acc02784343964400fc7deff.zip |
Fix off-by-one bugs.
While here, only set the GPIO pin state for output pins.
Pointy hat to: loos
Sponsored by: Rubicon Communications (Netgate)
Notes
Notes:
svn path=/head/; revision=287542
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/rccgpio/rccgpio.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/rccgpio/rccgpio.c b/sys/dev/rccgpio/rccgpio.c index dc44ac869d1f..8ce11d357afc 100644 --- a/sys/dev/rccgpio/rccgpio.c +++ b/sys/dev/rccgpio/rccgpio.c @@ -126,7 +126,7 @@ rcc_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) return (EINVAL); *caps = rcc_pins[pin].caps; @@ -140,7 +140,7 @@ rcc_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) return (EINVAL); /* Flags cannot be changed. */ @@ -155,7 +155,7 @@ rcc_gpio_pin_getname(device_t dev, uint32_t pin, char *name) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) return (EINVAL); memcpy(name, rcc_pins[pin].name, GPIOMAXNAME); @@ -169,7 +169,7 @@ rcc_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) return (EINVAL); /* Flags cannot be changed - risk of short-circuit!!! */ @@ -183,7 +183,10 @@ rcc_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) + return (EINVAL); + + if ((rcc_pins[pin].caps & GPIO_PIN_OUTPUT) == 0) return (EINVAL); RCC_GPIO_LOCK(sc); @@ -204,7 +207,7 @@ rcc_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) uint32_t value; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) return (EINVAL); RCC_GPIO_LOCK(sc); @@ -224,7 +227,10 @@ rcc_gpio_pin_toggle(device_t dev, uint32_t pin) struct rcc_gpio_softc *sc; sc = device_get_softc(dev); - if (pin > sc->sc_gpio_npins) + if (pin >= sc->sc_gpio_npins) + return (EINVAL); + + if ((rcc_pins[pin].caps & GPIO_PIN_OUTPUT) == 0) return (EINVAL); RCC_GPIO_LOCK(sc); |