Help Request - Fix Out of Bounds Subscript Warning in Raspberry Pi
Joel Sherrill
joel at rtems.org
Tue Apr 25 23:03:30 UTC 2017
Pavel,
Feel free to commit the patch.
Why do you think the warning is a false positive?
--joel
On Tue, Apr 25, 2017 at 4:53 AM, Pavel Pisa <ppisa4lists at pikron.com> wrote:
> From 3a2957faeb744af08196f1fd3baac71f15d76c85 Mon Sep 17 00:00:00 2001
> Message-Id: <3a2957faeb744af08196f1fd3baac71f15d76c85.1493113587.git.
> ppisa at pikron.com>
> From: Pavel Pisa <ppisa at pikron.com>
> Date: Tue, 25 Apr 2017 11:45:57 +0200
> Subject: [PATCH] bsp/raspberrypi: GPIO silence warning and ensure that
> lock is
> always released.
> To: rtems-devel at rtems.org
>
> Signed-off-by: Pavel Pisa <ppisa at pikron.com>
> ---
> c/src/lib/libbsp/shared/gpio.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> Not tested or even compiled quick fix of warning and more serious real
> problem.
> The waning seems to be GCC false positive. The first iteration
> (i == 0) sets *bank_number for sure. But return with RTEMS_INVALID_ID can
> happen without lock release.
>
> diff --git a/c/src/lib/libbsp/shared/gpio.c b/c/src/lib/libbsp/shared/
> gpio.c
> index 9ceeb407..bf0e415 100644
> --- a/c/src/lib/libbsp/shared/gpio.c
> +++ b/c/src/lib/libbsp/shared/gpio.c
> @@ -303,6 +303,7 @@ static rtems_status_code get_pin_bitmask(
> uint32_t pin_number;
> uint32_t bank;
> uint8_t i;
> + int locked_bank = -1;
>
> if ( pin_count < 1 ) {
> return RTEMS_UNSATISFIED;
> @@ -314,18 +315,23 @@ static rtems_status_code get_pin_bitmask(
> pin_number = pins[i];
>
> if ( pin_number < 0 || pin_number >= BSP_GPIO_PIN_COUNT ) {
> + if (locked_bank >= 0)
> + RELEASE_LOCK(gpio_bank_state[locked_bank].lock);
> +
> return RTEMS_INVALID_ID;
> }
>
> bank = BANK_NUMBER(pin_number);
>
> - if ( i == 0 ) {
> + if ( locked_bank < 0 ) {
> *bank_number = bank;
> + locked_bank = bank;
>
> - ACQUIRE_LOCK(gpio_bank_state[bank].lock);
> + ACQUIRE_LOCK(gpio_bank_state[locked_bank].lock);
> }
> - else if ( bank != *bank_number ) {
> - RELEASE_LOCK(gpio_bank_state[*bank_number].lock);
> + else if ( bank != locked_bank ) {
> + if (locked_bank >= 0)
> + RELEASE_LOCK(gpio_bank_state[locked_bank].lock);
>
> return RTEMS_UNSATISFIED;
> }
> @@ -334,7 +340,7 @@ static rtems_status_code get_pin_bitmask(
> gpio_pin_state[pin_number].pin_function != function ||
> gpio_pin_state[pin_number].on_group
> ) {
> - RELEASE_LOCK(gpio_bank_state[bank].lock);
> + RELEASE_LOCK(gpio_bank_state[locked_bank].lock);
>
> return RTEMS_NOT_CONFIGURED;
> }
> @@ -342,7 +348,7 @@ static rtems_status_code get_pin_bitmask(
> *bitmask |= (1 << PIN_NUMBER(pin_number));
> }
>
> - RELEASE_LOCK(gpio_bank_state[bank].lock);
> + RELEASE_LOCK(gpio_bank_state[locked_bank].lock);
>
> return RTEMS_SUCCESSFUL;
> }
> --
> 1.9.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20170425/66613caf/attachment-0002.html>
More information about the devel
mailing list