Merge branch 'contrib/github_pr_9491' into 'master'

[gpio] calloc in critical section (GitHub PR)

Closes IDFGH-7980

See merge request espressif/esp-idf!19380
This commit is contained in:
morris
2022-08-18 10:49:41 +08:00

View File

@@ -447,14 +447,24 @@ static void IRAM_ATTR gpio_intr_service(void *arg)
esp_err_t gpio_install_isr_service(int intr_alloc_flags) esp_err_t gpio_install_isr_service(int intr_alloc_flags)
{ {
GPIO_CHECK(gpio_context.gpio_isr_func == NULL, "GPIO isr service already installed", ESP_ERR_INVALID_STATE); GPIO_CHECK(gpio_context.gpio_isr_func == NULL, "GPIO isr service already installed", ESP_ERR_INVALID_STATE);
esp_err_t ret; esp_err_t ret = ESP_ERR_NO_MEM;
portENTER_CRITICAL(&gpio_context.gpio_spinlock); gpio_isr_func_t *isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t));
gpio_context.gpio_isr_func = (gpio_isr_func_t *) calloc(GPIO_NUM_MAX, sizeof(gpio_isr_func_t)); if (isr_func) {
portEXIT_CRITICAL(&gpio_context.gpio_spinlock); portENTER_CRITICAL(&gpio_context.gpio_spinlock);
if (gpio_context.gpio_isr_func == NULL) { if (gpio_context.gpio_isr_func == NULL) {
ret = ESP_ERR_NO_MEM; gpio_context.gpio_isr_func = isr_func;
} else { portEXIT_CRITICAL(&gpio_context.gpio_spinlock);
ret = gpio_isr_register(gpio_intr_service, NULL, intr_alloc_flags, &gpio_context.gpio_isr_handle); 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);
}
} }
return ret; return ret;