gpio: fix potential race condition inside gpio_install_isr_service

pull/9656/head
songruojing 2022-08-04 17:38:54 +08:00
rodzic 34ff721c92
commit 6e8ebdb6b7
1 zmienionych plików z 13 dodań i 6 usunięć

Wyświetl plik

@ -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));
if (isr_func) {
portENTER_CRITICAL(&gpio_context.gpio_spinlock);
gpio_context.gpio_isr_func = isr_func;
portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle);
if (ret != ESP_OK) {
// registering failed, free allocated resources
gpio_uninstall_isr_service();
if (gpio_context.gpio_isr_func == NULL) {
gpio_context.gpio_isr_func = isr_func;
portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle);
if (ret != ESP_OK) {
// 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);
}
}