fix(stability): disable dangerous mbedtls free configs, place panic handler in IRAM, and make prefetch safe and on-demand
All checks were successful
ESP32 Build & Release / build (push) Successful in 1m11s
All checks were successful
ESP32 Build & Release / build (push) Successful in 1m11s
This commit is contained in:
@@ -10,7 +10,7 @@ menu "MTG RFID Companion"
|
|||||||
|
|
||||||
config MTG_SCAN_PREFETCH
|
config MTG_SCAN_PREFETCH
|
||||||
bool "Prefetch card data for all mapped UIDs at boot"
|
bool "Prefetch card data for all mapped UIDs at boot"
|
||||||
default y
|
default n
|
||||||
|
|
||||||
config MTG_GITEA_URL
|
config MTG_GITEA_URL
|
||||||
string "Gitea instance base URL (e.g. https://gitea.com)"
|
string "Gitea instance base URL (e.g. https://gitea.com)"
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ typedef struct {
|
|||||||
size_t cap;
|
size_t cap;
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
FILE *file; /* when downloading to a file */
|
FILE *file; /* when downloading to a file */
|
||||||
|
const char *file_path;
|
||||||
int status;
|
int status;
|
||||||
} http_sink_t;
|
} http_sink_t;
|
||||||
|
|
||||||
@@ -153,11 +154,22 @@ static esp_err_t http_request(const char *url, http_sink_t *sink)
|
|||||||
return ESP_ERR_TIMEOUT;
|
return ESP_ERR_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disable power save during HTTPS requests for maximum reliability */
|
||||||
|
wifi_manager_set_power_save(false);
|
||||||
|
|
||||||
esp_err_t overall_ret = ESP_FAIL;
|
esp_err_t overall_ret = ESP_FAIL;
|
||||||
for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
||||||
if (sink->file != NULL) {
|
if (sink->file != NULL) {
|
||||||
rewind(sink->file);
|
if (attempt > 0 && sink->file_path != NULL) {
|
||||||
ftruncate(fileno(sink->file), 0);
|
fclose(sink->file);
|
||||||
|
sink->file = fopen(sink->file_path, "wb");
|
||||||
|
if (sink->file == NULL) {
|
||||||
|
overall_ret = ESP_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rewind(sink->file);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sink->len = 0;
|
sink->len = 0;
|
||||||
}
|
}
|
||||||
@@ -171,6 +183,7 @@ static esp_err_t http_request(const char *url, http_sink_t *sink)
|
|||||||
.user_data = sink,
|
.user_data = sink,
|
||||||
.buffer_size = 2048,
|
.buffer_size = 2048,
|
||||||
.crt_bundle_attach = esp_crt_bundle_attach,
|
.crt_bundle_attach = esp_crt_bundle_attach,
|
||||||
|
.keep_alive_enable = false,
|
||||||
};
|
};
|
||||||
esp_http_client_handle_t client = esp_http_client_init(&cfg);
|
esp_http_client_handle_t client = esp_http_client_init(&cfg);
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
@@ -201,6 +214,7 @@ static esp_err_t http_request(const char *url, http_sink_t *sink)
|
|||||||
vTaskDelay(pdMS_TO_TICKS(500));
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wifi_manager_set_power_save(true);
|
||||||
wifi_manager_release_net_lock();
|
wifi_manager_release_net_lock();
|
||||||
return overall_ret;
|
return overall_ret;
|
||||||
}
|
}
|
||||||
@@ -230,7 +244,7 @@ static esp_err_t http_download_file(const char *url, const char *path)
|
|||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
http_sink_t sink = { .file = f };
|
http_sink_t sink = { .file = f, .file_path = tmp };
|
||||||
esp_err_t ret = http_request(url, &sink);
|
esp_err_t ret = http_request(url, &sink);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
@@ -441,8 +455,17 @@ static esp_err_t scryfall_ensure_cached(const char *card_name, const char *uid)
|
|||||||
/* net_task */
|
/* net_task */
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
#ifdef CONFIG_MTG_SCAN_PREFETCH
|
||||||
static void prefetch_mappings(void)
|
static void prefetch_mappings(void)
|
||||||
{
|
{
|
||||||
|
/* Settle delay: give system and Wi-Fi time to settle before background fetch */
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000));
|
||||||
|
|
||||||
|
if (esp_get_free_heap_size() < 40000) {
|
||||||
|
ESP_LOGW(TAG, "Heap too low (%u bytes) for startup prefetch, skipping", (unsigned int)esp_get_free_heap_size());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
if (storage_read_text(STORAGE_MAPPINGS, &buf, &len) != ESP_OK || buf == NULL) {
|
if (storage_read_text(STORAGE_MAPPINGS, &buf, &len) != ESP_OK || buf == NULL) {
|
||||||
@@ -463,12 +486,14 @@ static void prefetch_mappings(void)
|
|||||||
cJSON_ArrayForEach(item, root) {
|
cJSON_ArrayForEach(item, root) {
|
||||||
uid = item->string;
|
uid = item->string;
|
||||||
if (uid == NULL || item->valuestring == NULL) continue;
|
if (uid == NULL || item->valuestring == NULL) continue;
|
||||||
scryfall_ensure_cached(item->valuestring, uid);
|
/* Call scryfall_do_fetch directly so we do not clobber UI fetch signaling */
|
||||||
|
scryfall_do_fetch(item->valuestring, uid);
|
||||||
/* Rate-limit delay: Scryfall requests 50-100ms between queries */
|
/* Rate-limit delay: Scryfall requests 50-100ms between queries */
|
||||||
vTaskDelay(pdMS_TO_TICKS(100));
|
vTaskDelay(pdMS_TO_TICKS(150));
|
||||||
}
|
}
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void net_task(void *arg)
|
static void net_task(void *arg)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ CONFIG_PARTITION_TABLE_MD5=y
|
|||||||
#
|
#
|
||||||
CONFIG_MTG_WIFI_SSID="WiFimodem-FD58"
|
CONFIG_MTG_WIFI_SSID="WiFimodem-FD58"
|
||||||
CONFIG_MTG_WIFI_PASS="gzhrt5yzm3"
|
CONFIG_MTG_WIFI_PASS="gzhrt5yzm3"
|
||||||
CONFIG_MTG_SCAN_PREFETCH=y
|
# CONFIG_MTG_SCAN_PREFETCH is not set
|
||||||
CONFIG_MTG_GITEA_URL="https://gitea.com"
|
CONFIG_MTG_GITEA_URL="https://gitea.com"
|
||||||
CONFIG_MTG_GITEA_REPO_OWNER="user"
|
CONFIG_MTG_GITEA_REPO_OWNER="user"
|
||||||
CONFIG_MTG_GITEA_REPO_NAME="espMTG"
|
CONFIG_MTG_GITEA_REPO_NAME="espMTG"
|
||||||
@@ -1156,7 +1156,7 @@ CONFIG_ESP_TASK_WDT_INIT=y
|
|||||||
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
|
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
|
||||||
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
|
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
|
||||||
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
|
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
|
||||||
# CONFIG_ESP_PANIC_HANDLER_IRAM is not set
|
CONFIG_ESP_PANIC_HANDLER_IRAM=y
|
||||||
# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
|
# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
|
||||||
CONFIG_ESP_DEBUG_OCDAWARE=y
|
CONFIG_ESP_DEBUG_OCDAWARE=y
|
||||||
# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set
|
# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set
|
||||||
@@ -1384,7 +1384,6 @@ CONFIG_FREERTOS_NO_AFFINITY=0xFFFFFFFF
|
|||||||
CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
|
CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
|
||||||
CONFIG_FREERTOS_DEBUG_OCDAWARE=y
|
CONFIG_FREERTOS_DEBUG_OCDAWARE=y
|
||||||
CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
|
CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
|
||||||
CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y
|
|
||||||
CONFIG_FREERTOS_NUMBER_OF_CORES=2
|
CONFIG_FREERTOS_NUMBER_OF_CORES=2
|
||||||
CONFIG_FREERTOS_IN_IRAM=y
|
CONFIG_FREERTOS_IN_IRAM=y
|
||||||
# end of FreeRTOS
|
# end of FreeRTOS
|
||||||
@@ -1666,8 +1665,7 @@ CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
|||||||
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
|
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
|
||||||
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
|
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
|
||||||
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
|
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
|
||||||
CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y
|
# CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA is not set
|
||||||
CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT=y
|
|
||||||
# CONFIG_MBEDTLS_DEBUG is not set
|
# CONFIG_MBEDTLS_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -34,11 +34,15 @@ CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
|||||||
CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
|
CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
|
||||||
CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=2
|
CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=2
|
||||||
|
|
||||||
# Watchdog Timeouts for Flash Erase & OTA Operations
|
# Watchdog & Panic Handlers
|
||||||
CONFIG_ESP_INT_WDT_TIMEOUT_MS=2000
|
CONFIG_ESP_INT_WDT_TIMEOUT_MS=2000
|
||||||
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
|
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
|
||||||
|
CONFIG_ESP_PANIC_HANDLER_IRAM=y
|
||||||
|
|
||||||
# mbedTLS Dynamic Buffers & Memory Optimization (Vital for ESP32 without PSRAM)
|
# Prefetch disabled by default for boot stability
|
||||||
|
CONFIG_MTG_SCAN_PREFETCH=n
|
||||||
|
|
||||||
|
# mbedTLS Dynamic Buffers (Keep only dynamic buffer; free ca cert causes crashes with crt bundle)
|
||||||
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
|
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y
|
||||||
CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y
|
# CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA is not set
|
||||||
CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT=y
|
# CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT is not set
|
||||||
Reference in New Issue
Block a user