forked from espressif/esp-idf
gpio: fix potential race condition inside gpio_install_isr_service
This commit is contained in:
@@ -451,12 +451,19 @@ esp_err_t gpio_install_isr_service(int intr_alloc_flags)
|
|||||||
gpio_isr_func_t *isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t));
|
gpio_isr_func_t *isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t));
|
||||||
if (isr_func) {
|
if (isr_func) {
|
||||||
portENTER_CRITICAL(&gpio_context.gpio_spinlock);
|
portENTER_CRITICAL(&gpio_context.gpio_spinlock);
|
||||||
gpio_context.gpio_isr_func = isr_func;
|
if (gpio_context.gpio_isr_func == NULL) {
|
||||||
portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
|
gpio_context.gpio_isr_func = isr_func;
|
||||||
ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle);
|
portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
|
||||||
if (ret != ESP_OK) {
|
ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle);
|
||||||
// registering failed, free allocated resources
|
if (ret != ESP_OK) {
|
||||||
gpio_uninstall_isr_service();
|
// registering failed, uninstall isr service
|
||||||
|
gpio_uninstall_isr_service();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// isr service already installed, free allocated resource
|
||||||
|
portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
|
||||||
|
ret = ESP_ERR_INVALID_STATE;
|
||||||
|
free(isr_func);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user