diff options
author | Gedare Bloom <gedare@rtems.org> | 2015-11-09 13:30:00 -0500 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2015-11-09 13:42:04 -0500 |
commit | f8bdd12a48d82a26cd9ddb84bdfa1544a4592e0d (patch) | |
tree | 2de85b1b01a064a63a91374dd434cfedba75e460 | |
parent | LPC1768: Fix compilation error (diff) | |
download | rtems-f8bdd12a48d82a26cd9ddb84bdfa1544a4592e0d.tar.bz2 |
gpio: free memory in error path
Updates #2462.
-rw-r--r-- | c/src/lib/libbsp/shared/gpio.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/shared/gpio.c b/c/src/lib/libbsp/shared/gpio.c index b8065563cd..9ceeb4070f 100644 --- a/c/src/lib/libbsp/shared/gpio.c +++ b/c/src/lib/libbsp/shared/gpio.c @@ -1708,10 +1708,8 @@ rtems_status_code rtems_gpio_enable_interrupt( return RTEMS_RESOURCE_IN_USE; } - interrupt_state = gpio_pin_state[pin_number].interrupt_state; - /* If an interrupt configuration is already in place for this pin. */ - if ( interrupt_state != NULL ) { + if ( gpio_pin_state[pin_number].interrupt_state != NULL ) { RELEASE_LOCK(gpio_bank_state[bank].lock); return RTEMS_RESOURCE_IN_USE; @@ -1724,15 +1722,12 @@ rtems_status_code rtems_gpio_enable_interrupt( return RTEMS_NO_MEMORY; } - gpio_pin_state[pin_number].interrupt_state->active_interrupt = NONE; - gpio_pin_state[pin_number].interrupt_state->debouncing_tick_count = 0; - gpio_pin_state[pin_number].interrupt_state->last_isr_tick = 0; - - rtems_chain_initialize_empty( - &gpio_pin_state[pin_number].interrupt_state->handler_chain - ); - interrupt_state = gpio_pin_state[pin_number].interrupt_state; + interrupt_state->active_interrupt = NONE; + interrupt_state->debouncing_tick_count = 0; + interrupt_state->last_isr_tick = 0; + + rtems_chain_initialize_empty( &interrupt_state->handler_chain ); interrupt_state->active_interrupt = interrupt; interrupt_state->handler_flag = flag; @@ -1742,6 +1737,8 @@ rtems_status_code rtems_gpio_enable_interrupt( sc = rtems_gpio_interrupt_handler_install(pin_number, handler, arg); if ( sc != RTEMS_SUCCESSFUL ) { + free(interrupt_state); + gpio_pin_state[pin_number].interrupt_state = NULL; RELEASE_LOCK(gpio_bank_state[bank].lock); return RTEMS_UNSATISFIED; |