mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
fix(adc): add missing input validation for channel and ret_handle
- adc_cali_curve_fitting: validate config->chan in check_valid() to prevent OOB access into s_adc_cali_chan_compens compensation table - adc_filter: make s_adc_filter_free idempotent on !UNIT_BINDED SoCs to prevent double-free on repeated adc_del_continuous_iir_filter - adc_cali_line_fitting(esp32): fix config && config typo to config && ret_handle, preventing NULL-pointer dereference
This commit is contained in:
@@ -222,6 +222,7 @@ static esp_err_t check_valid(const adc_cali_curve_fitting_config_t *config)
|
|||||||
{
|
{
|
||||||
ESP_RETURN_ON_FALSE(config->unit_id < SOC_ADC_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC unit");
|
ESP_RETURN_ON_FALSE(config->unit_id < SOC_ADC_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC unit");
|
||||||
ESP_RETURN_ON_FALSE(config->atten < SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC attenuation");
|
ESP_RETURN_ON_FALSE(config->atten < SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC attenuation");
|
||||||
|
ESP_RETURN_ON_FALSE(config->chan < SOC_ADC_CHANNEL_NUM(config->unit_id), ESP_ERR_INVALID_ARG, TAG, "invalid ADC channel");
|
||||||
|
|
||||||
bool available_oneshot_bitwidth = (config->bitwidth >= ADC_LL_RTC_MIN_BITWIDTH && config->bitwidth <= ADC_LL_RTC_MAX_BITWIDTH);
|
bool available_oneshot_bitwidth = (config->bitwidth >= ADC_LL_RTC_MIN_BITWIDTH && config->bitwidth <= ADC_LL_RTC_MAX_BITWIDTH);
|
||||||
bool available_dma_bitwidth = (config->bitwidth >= SOC_ADC_DIGI_MIN_BITWIDTH && config->bitwidth <= SOC_ADC_DIGI_MAX_BITWIDTH);
|
bool available_dma_bitwidth = (config->bitwidth >= SOC_ADC_DIGI_MIN_BITWIDTH && config->bitwidth <= SOC_ADC_DIGI_MAX_BITWIDTH);
|
||||||
|
|||||||
@@ -78,11 +78,15 @@ static esp_err_t s_adc_filter_claim(adc_continuous_handle_t handle, adc_iir_filt
|
|||||||
static esp_err_t s_adc_filter_free(adc_iir_filter_t *filter_ctx)
|
static esp_err_t s_adc_filter_free(adc_iir_filter_t *filter_ctx)
|
||||||
{
|
{
|
||||||
assert(filter_ctx);
|
assert(filter_ctx);
|
||||||
|
esp_err_t ret = ESP_ERR_NOT_FOUND;
|
||||||
portENTER_CRITICAL(&s_filter_spinlock);
|
portENTER_CRITICAL(&s_filter_spinlock);
|
||||||
filter_ctx->continuous_ctx->iir_filter[filter_ctx->filter_id] = NULL;
|
if (filter_ctx->continuous_ctx->iir_filter[filter_ctx->filter_id] != NULL) {
|
||||||
|
filter_ctx->continuous_ctx->iir_filter[filter_ctx->filter_id] = NULL;
|
||||||
|
ret = ESP_OK;
|
||||||
|
}
|
||||||
portEXIT_CRITICAL(&s_filter_spinlock);
|
portEXIT_CRITICAL(&s_filter_spinlock);
|
||||||
|
|
||||||
return ESP_OK;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ typedef struct {
|
|||||||
esp_err_t adc_cali_create_scheme_line_fitting(const adc_cali_line_fitting_config_t *config, adc_cali_handle_t *ret_handle)
|
esp_err_t adc_cali_create_scheme_line_fitting(const adc_cali_line_fitting_config_t *config, adc_cali_handle_t *ret_handle)
|
||||||
{
|
{
|
||||||
esp_err_t ret = ESP_OK;
|
esp_err_t ret = ESP_OK;
|
||||||
ESP_RETURN_ON_FALSE(config && config, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
|
ESP_RETURN_ON_FALSE(config && ret_handle, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
|
||||||
ESP_RETURN_ON_FALSE(config->unit_id < SOC_ADC_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC unit");
|
ESP_RETURN_ON_FALSE(config->unit_id < SOC_ADC_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC unit");
|
||||||
ESP_RETURN_ON_FALSE(config->atten < SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC attenuation");
|
ESP_RETURN_ON_FALSE(config->atten < SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid ADC attenuation");
|
||||||
ESP_RETURN_ON_FALSE(((config->bitwidth >= ADC_LL_RTC_MIN_BITWIDTH && config->bitwidth <= ADC_LL_RTC_MAX_BITWIDTH) || config->bitwidth == ADC_BITWIDTH_DEFAULT), ESP_ERR_INVALID_ARG, TAG, "invalid bitwidth");
|
ESP_RETURN_ON_FALSE(((config->bitwidth >= ADC_LL_RTC_MIN_BITWIDTH && config->bitwidth <= ADC_LL_RTC_MAX_BITWIDTH) || config->bitwidth == ADC_BITWIDTH_DEFAULT), ESP_ERR_INVALID_ARG, TAG, "invalid bitwidth");
|
||||||
@@ -205,6 +205,9 @@ esp_err_t adc_cali_create_scheme_line_fitting(const adc_cali_line_fitting_config
|
|||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
if (chars) {
|
||||||
|
free(chars);
|
||||||
|
}
|
||||||
if (scheme) {
|
if (scheme) {
|
||||||
free(scheme);
|
free(scheme);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user