summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGedare Bloom <gedare@rtems.org>2015-11-09 13:30:00 -0500
committerGedare Bloom <gedare@rtems.org>2015-11-09 13:42:04 -0500
commitf8bdd12a48d82a26cd9ddb84bdfa1544a4592e0d (patch)
tree2de85b1b01a064a63a91374dd434cfedba75e460
parentLPC1768: Fix compilation error (diff)
downloadrtems-f8bdd12a48d82a26cd9ddb84bdfa1544a4592e0d.tar.bz2
gpio: free memory in error path
Updates #2462.
-rw-r--r--c/src/lib/libbsp/shared/gpio.c19
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;