Commit Graph
100 Commits
Author SHA1 Message Date
Konstantin Kondrashov 0382b59e21 feat(esp_timer): Adds blocking stop function 2026-09-10 10:45:24 +08:00
Konstantin Kondrashov db31a63351 refactor(esp_timer): Remove unnecessary nested list lock 2026-09-10 10:45:24 +08:00
Konstantin Kondrashov 581b967a59 feat(esp_timer): esp_timer_is_active while callback is running 2026-09-10 10:45:24 +08:00
Konstantin Kondrashov b116ab3a21 fix(bootloader): increase partition table offset for ESP32-P4 in affected test configs 2026-08-28 17:15:49 +03:00
Konstantin Kondrashov 777c72a01e fix(esp_image_format): validate MMU page size 2026-08-28 17:15:49 +03:00
Konstantin Kondrashov 85d56ea446 fix(esp_image_format): verify length of segment #0 for app description 2026-08-28 17:15:49 +03:00
Konstantin Kondrashov 95c4491fba fix(esp_image_format): Verify image segment count 2026-08-28 17:15:49 +03:00
Konstantin Kondrashov a001772d37 fix(heap): trace heap_caps_calloc allocations in standalone heap tracing
heap_caps_calloc_base() calls heap_caps_malloc_base() from the same
translation unit (heap_caps_base.c). GNU ld --wrap only redirects
undefined references, so that intra-object call binds to the real
heap_caps_malloc_base and never enters __wrap_heap_caps_malloc_base.
As a result, allocations made through heap_caps_calloc() were never
recorded by heap tracing, silently hiding potentially large INTERNAL
leaks (e.g. mbedtls SSL buffers via MALLOC_CAP_INTERNAL).

Add heap_caps_calloc_base to the --wrap list and implement
__wrap_heap_caps_calloc_base, which records the allocation via a
noinline trace_calloc helper (mirroring trace_malloc so the recorded
call stack depth stays consistent) and calls __real_heap_caps_calloc_base.
The inner malloc_base call remains same-TU and unwrapped, so each
calloc produces exactly one trace record (no double counting).
2026-08-28 17:15:44 +03:00
Konstantin Kondrashov 918cac578b fix(bootloader): use correct format specifier for MMU_LL_END_DROM_ENTRY_VADDR
MMU_LL_END_DROM_ENTRY_VADDR is an int-typed constant on several targets,
so logging it with PRIx32 (uint32_t) triggered -Werror=format=. Use the
plain %x specifier which matches the int type.

Closes https://github.com/espressif/esp-idf/issues/18857
2026-07-22 09:33:19 +03:00
Konstantin Kondrashov 7c8c885a41 fix(esp_event): free queued legacy cleanup ctx on loop delete
When a loop is deleted while an internal legacy "cleanup" event is still
queued (posted by a deferred self-unregistration from within a handler),
esp_event_loop_delete() drained the queue but only freed the post payload,
leaking the heap copy of the handler context allocated for the legacy path.

Free ctx->handler_ctx for queued legacy cleanup events while draining the
queue, mirroring the cleanup done in esp_event_loop_run().

Add a regression test that leaves a legacy cleanup event queued and asserts
no memory is leaked on loop deletion.
2026-07-21 17:16:07 +03:00
Konstantin Kondrashov bcfc88681d fix(esp_event): clear running_task before releasing mutex on tick timeout
When esp_event_loop_run() exited via the ticks-expired break path,
loop->running_task was left pointing to the current task handle.
Any subsequent trylock in esp_event_handler_unregister_with_internal()
would see a stale non-NULL running_task and take the wrong code path.
2026-07-21 17:16:07 +03:00
Konstantin Kondrashov 9947dfdc58 fix(esp_event): prevent UAF race between post and loop delete (SEC-222)
esp_event_post_to() could access loop->queue / loop->mutex after
esp_event_loop_delete() freed them when both ran concurrently.

Introduce esp_event_loop_state_t with:
- posts_in_flight: reference-count incremented atomically (under
  state.lock spinlock) before touching any loop resources, decremented
  on every exit path via goto on_err.
- deleting: atomic_bool set by esp_event_loop_delete() to block new
  posts from entering the critical section.

esp_event_loop_delete() sets deleting=true, then busy-waits (releasing
and re-acquiring loop->mutex each tick) until posts_in_flight reaches
zero before proceeding with teardown.

esp_event_isr_post_to() performs a lock-free atomic_load of deleting as
a best-effort guard; ISR context cannot participate in the spinlock
protocol but the window is documented and accepted.
2026-07-21 17:16:07 +03:00
Konstantin Kondrashov fca32e128a fix(esp_event): skip dispatch for internal cleanup events (SEC-221)
After processing an esp_event_handler_cleanup sentinel, execution fell
through into the regular dispatch block. Every loop-level (ANY_BASE/
ANY_ID) handler was invoked with base="cleanup" and event_data pointing
at the internal esp_event_remove_handler_context_t struct.

Consequences:
- Information disclosure: internal handler addresses and loop instance
  pointer are exposed to every loop-level handler.
- UAF: if a handler stores event_data for later use, post_instance_delete
  frees the ctx, turning the stored pointer into a dangling reference.
- Logic corruption: handlers that switch on base with a default branch
  misbehave on every unregister anywhere in the system.

Fix: wrap the regular dispatch block in an else clause so it is skipped
entirely for cleanup events. post_instance_delete, ticks accounting, and
xSemaphoreGiveRecursive remain in the shared tail executed for both paths.

Closes SEC_221
2026-07-21 17:16:07 +03:00
Konstantin Kondrashov 5ad6141c37 fix(esp_event): use recursive mutex API in handler unregister (SEC-220)
1) loop->mutex is created with xSemaphoreCreateRecursiveMutex(). FreeRTOS
requires that recursive mutexes are only acquired and released with
xSemaphoreTakeRecursive / xSemaphoreGiveRecursive.

esp_event_handler_unregister_with_internal() used the non-recursive
xSemaphoreTake(loop->mutex, 0) / xSemaphoreGive(loop->mutex) in the fast
path. The non-recursive Take bypasses uxRecursiveCallCount bookkeeping;
if the same task subsequently takes the mutex recursively (e.g. re-entry
from a handler or a follow-up register), the call count drifts. The
non-recursive Give then unconditionally drops the holder, allowing another
task to acquire the mutex while the original task still believes it holds
the lock — a full lock violation on the handler list leading to UAF and
potential RCE on attacker-driven event floods.

Fix: replace xSemaphoreTake/xSemaphoreGive with the Recursive variants in
the fast (try-take with timeout 0) path of unregister_with_internal.

2) avoid use-after-free when unregistering handler from a callback

The recursive try-lock introduced in SEC-220 succeeds re-entrantly when a
handler unregisters itself from within its own callback, causing the handler
node to be freed immediately while the dispatch loop still writes profiling
counters to it after the callback returns. Route the in-callback case to the
deferred cleanup path and only free directly once no dispatch is active.

Closes SEC_220
2026-07-21 17:16:07 +03:00
Konstantin Kondrashov 07a1739c24 fix(esp_event): protect is_handler_registered traversal with mutex (SEC-219)
esp_event_is_handler_registered() walked loop_nodes, base_nodes, id_nodes
and handler lists with no lock held, then released an unowned mutex at the
'out:' label via xSemaphoreGive().

Concurrent register/unregister/delete operations can free handler nodes
during the unlocked walk (SLIST UAF). The xSemaphoreGive on an unowned
recursive mutex corrupts the recursive call-count of any task that
legitimately holds the mutex.

Fix:
- Take loop->mutex with xSemaphoreTakeRecursive before the traversal.
- Replace xSemaphoreGive at the 'out:' label with xSemaphoreGiveRecursive
  so every exit path holds the mutex for exactly one balanced take/give.

Closes SEC_219
2026-07-21 17:16:06 +03:00
Konstantin Kondrashov fb650ab64a fix(esp_event): fix format string vulnerability in esp_event_dump (SEC-064)
fprintf(file, buf) is a format-string sink: if any registered event base
or handler name contains "%", fprintf interprets it as a format directive,
causing an information leak or crash.

Replace with fprintf(file, "%s", buf) so the buffer is always treated as
plain text regardless of its content.

Closes SEC_064
2026-07-21 17:16:06 +03:00
Konstantin Kondrashov d4ad53aaef fix(docs): Update bootloader anti-rollback documentation 2026-07-16 13:44:55 +03:00
Konstantin Kondrashov 19fd35a510 fix(bootloader): Hide bootloader anti-rollback Kconfig where not supported 2026-07-16 09:38:30 +03:00
Konstantin Kondrashov 5344f4fb85 fix(bootloader_hooks): Fix log_v2 support in bootloader hooks
Closes https://github.com/espressif/esp-idf/issues/18482
2026-05-14 14:08:58 +03:00
Konstantin Kondrashov 352ec04926 fix(console): Avoid REPL task busy loop when linenoise returns NULL
When the REPL input backend is unavailable, linenoise() may return NULL
immediately. esp_console_repl_task() currently retries without yielding,
which can make the console_repl task spin continuously.

For USB Serial/JTAG console this can happen when the REPL is started
without an attached USB host. Since the REPL task has priority 2, this
can starve lower-priority tasks, prevent app_main from continuing after
esp_console_start_repl(), and trigger the task watchdog due to IDLE not
running.

Add a small delay before retrying when linenoise() returns NULL.

Closes https://github.com/espressif/esp-idf/issues/18485
2026-05-14 11:01:39 +03:00
Konstantin Kondrashov 7d5df005d2 fix(test_apps): Increase CONFIG_PARTITION_TABLE_OFFSET to 0x9000
Fix some test apps that have a partition table offset of 0x8000,
which left no room for the bootloader for some chips.
2026-05-13 10:29:04 +03:00
Konstantin Kondrashov ce467787a9 feat(bootloader): Support recovery bootloader for ESP32P4/C61 2026-05-13 10:28:58 +03:00
Konstantin Kondrashov 7a45d611e4 feat(efuse): Adds efuse calibration field for esp32c5 2026-05-07 16:00:29 +03:00
Konstantin Kondrashov ae11eba923 fix(freertos): fix riscv pxEndOfStack offset alignment
Closes https://github.com/espressif/esp-idf/issues/18256
2026-05-01 15:50:29 +03:00
Konstantin Kondrashov 7d560140d4 fix(xtensa): use LBEG/LCOUNT names in zol macros 2026-05-01 12:46:26 +03:00
Konstantin Kondrashov 5ea2823c7c fix(esp32): Fix access to MALLOC_CAP_IRAM_8BIT byte array in loop
The Xtensa load/store handler did not properly handle 8/16-bit
memory access to IRAM regions configured with MALLOC_CAP_IRAM_8BIT
(and CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY=y) from a loop
(LBEG/LEND/LCOUNT) context. This caused the loop to exit after
the first access, instead of continuing to iterate as intended.

Closes https://github.com/espressif/esp-idf/issues/14127
2026-05-01 12:46:26 +03:00
Konstantin Kondrashov 1c94a566cb feat(hal): Adds half-word read/write checks for efuse 2026-05-01 12:21:23 +03:00
Konstantin Kondrashov 13d9b43701 feat(efuse): Adds efuse flash fields for esp32c2 2026-05-01 12:21:15 +03:00
Konstantin Kondrashov 5561482b37 feat(efuse): Adds efuse for ESP32-H2 revision 1.2 2026-05-01 12:17:57 +03:00
Konstantin Kondrashov 325ebb8021 feat(ulp): Improved ULP delay API accuracy and removed floating point operations
Closes https://github.com/espressif/esp-idf/issues/17494
Closes https://github.com/espressif/esp-idf/issues/16891
2026-04-30 15:17:34 +03:00
Konstantin Kondrashov 152febebab fix(esp32): Fix IRAM_AS_8BIT_ACCESSIBLE_MEMORY accessible from ISR1 2026-04-07 14:47:43 +08:00
Konstantin Kondrashov ceae7792bf fix(efuse): erase virtual blocks before burn in damaged-reading test
Some chip may have BLOCK3 in use so we need to erase it before test.
2026-03-09 13:30:53 +02:00
Konstantin Kondrashov 9d766de03e fix(app_update): Fix tests for app_update on ESP32C5 2026-01-28 17:00:02 +02:00
Konstantin Kondrashov 3f5377a9b1 fix(efuse): Fix test where size of field was obtained incorrectly
When the eFuse field consists of single descriptor, its size can be
taken from struct member 'bit_count'. However, when the field consists of
multiple descriptors, the size should be obtained via esp_efuse_get_field_size()
2025-11-27 11:20:43 +05:30
Konstantin Kondrashov 997c8f50b5 fix(efuse): Adds missing SOC defines for ESP32-P4 v3 2025-11-27 11:20:43 +05:30
Konstantin Kondrashov dde1b3d791 fix(examples): Fix IPC ISR RISC-V test for ESP32-P4 rev3
Remove checks for MSTATUS and MCAUSE values that
may vary in different chip revisions.
2025-11-26 11:40:01 +05:30
Konstantin Kondrashov 0f22c814b9 feat(efuse): Adds calibration efuses for ESP32-P4 ECO5 2025-11-05 11:58:00 +02:00
Konstantin Kondrashov 37ebf6793e feat(ipc): Allow IPC recursion calls in esp_ipc_call 2025-10-20 14:25:24 +08:00
Konstantin Kondrashov 3ba0451b59 feat(efuse): Support efuses for ESP32-P4 ECO5 2025-10-16 14:09:01 +03:00
Konstantin Kondrashov a317db1622 fix(efuse): Fix enabling ROM secure download mode 2025-10-16 09:24:09 +03:00
Konstantin Kondrashov 4ae8b7d993 feat(efuse): Allow custom key purposes 2025-09-18 23:32:24 +08:00
Konstantin Kondrashov e9cae6c805 fix(ulp_riscv): Fix a delay function to handle small delays correctly
Fixed ulp_riscv_delay_cycles function

Closes https://github.com/espressif/esp-idf/issues/16891
2025-09-16 10:43:21 +03:00
Konstantin Kondrashov e73cbacd10 feat(esp_ringbuf): Fixes full no-split buffer frees item incorrectly
Closes https://github.com/espressif/esp-idf/issues/17466#issuecomment-3209730773
2025-09-16 10:19:33 +03:00
Konstantin Kondrashov c092365299 feat(docs): Update ESP32-C61 efuse documentation 2025-09-03 14:21:56 +03:00
Konstantin Kondrashov 5d946e6ec0 feat(efuse): Adds 3-bit field for wafer major version in ESP32-P4 2025-07-24 00:35:28 +08:00
Konstantin Kondrashov e72ea712e7 feat(esp_system): Adds Kconfigs to place code in IRAM 2025-07-24 00:34:58 +08:00
Konstantin Kondrashov 6f82f332fd fix(log): Fix bin log config available only for log version 2 2025-05-16 09:33:36 +03:00
Konstantin Kondrashov 0f7b621d47 refactor(partition_table): Refactoring of code style 2025-05-15 13:21:02 +03:00
Konstantin Kondrashov 72ae023a42 fix(partition_table): Ignore UTF-8 BOM bytes in csv file 2025-05-15 13:21:02 +03:00
Konstantin Kondrashov 3a6e5dba88 fix(efuse): Fix ESP32-C5 eFuse test for ECO2 2025-05-13 09:16:57 +03:00
Konstantin Kondrashov 3a72305e50 feat(efuse): Support efuses for ESP32-C5 ECO2 2025-05-09 09:29:31 +03:00
Konstantin Kondrashov 81c08911f0 feat(unity): Adds unit test ordering by file path and line number
Closes https://github.com/espressif/esp-idf/issues/15529
2025-04-24 13:16:05 +03:00
Konstantin Kondrashov 204046e799 feat(log): Add binary logging support 2025-04-23 15:46:34 +08:00
Konstantin Kondrashov 33633a5024 fix(esp_common): Fix DRAM_DMA_ALIGNED_ATTR for P4 2025-04-22 18:02:16 +03:00
Konstantin Kondrashov 82276fc918 feat(docs): Adds ULP main documentation page 2025-04-21 13:20:54 +03:00
Konstantin Kondrashov 44983e6496 fix(ulp): Fix accumulation of wakeup cause bits in ULP
Closes https://github.com/espressif/esp-idf/issues/15794
2025-04-18 12:14:07 +03:00
Konstantin Kondrashov d889031504 feat(soc): Adds core_num definition for Linux target
Closes https://github.com/espressif/esp-idf/issues/15758
2025-04-15 18:54:33 +03:00
Konstantin Kondrashov 917adbb171 fix(efuse): Adds missing efuses fields for ESP32-H4 2025-03-12 17:19:50 +08:00
Konstantin Kondrashov 5417edbe24 fix(efuse): Fix Coverity warning for destroy_block func 2025-03-07 16:44:22 +08:00
Konstantin Kondrashov 038d99f3c5 feat(efuse): Generate efuse source files for ESP32-H4 2025-02-26 09:50:11 +02:00
Konstantin Kondrashov 8155e60edf feat(esp_ringbuf): Update ring buffer doc
Closes https://github.com/espressif/esp-idf/issues/15298
2025-02-06 17:44:14 +02:00
Konstantin Kondrashov dbfb2489b4 fix(docs): Fixes log doc after review 2025-01-08 14:46:53 +08:00
Konstantin Kondrashov b37218ce1a feat(docs): Updates the log doc adding log v2 2025-01-08 14:46:53 +08:00
Konstantin Kondrashov b994f33f51 feat(log): Updates timestamp APIs 2025-01-08 14:46:53 +08:00
Konstantin Kondrashov bc46512ad5 feat(log): Make the buffer log API available to bootloader 2025-01-08 14:46:53 +08:00
Konstantin Kondrashov a5bc08fb55 feat(log): Use esp_log func in all LOG macros 2025-01-08 14:46:53 +08:00
Konstantin Kondrashov 820a73f4cc feat(espefuse): Adds efuses for esp32h2 eco5
- Support efuses that are not present in the main efuse table
2024-12-30 15:56:48 +02:00
Konstantin Kondrashov 15870abd87 feat(app_update): Adds test for invalidating OTA data slot of last boot app 2024-12-21 13:08:00 +02:00
Konstantin Kondrashov c9ea30e6c0 fix(app_update): Invalidate ota data slot of last boot app in esp_ota_begin
Closes https://github.com/espressif/esp-idf/issues/14808
2024-12-20 14:55:48 +02:00
Konstantin Kondrashov ad38ba16dd fix(bootloader_support): Fix overflowed constant in process_segment 2024-12-05 15:10:27 +08:00
Konstantin Kondrashov 5a245a389b fix(bootloader_support): Fix overflowed constant in bootloader_sha256_flash_contents 2024-12-05 15:10:27 +08:00
Konstantin Kondrashov 9d41a098d7 fix(esp_system): Fix structurally dead code in esp_ipc.c ipc_task 2024-12-05 15:10:27 +08:00
Konstantin Kondrashov d9265a3f88 feat(log): Update esp_log_buffer 2024-12-03 18:03:06 +08:00
Konstantin Kondrashov 9f2b892512 feat(log): Move LOG_FORMAT macros out of esp_log.h 2024-12-03 18:03:06 +08:00
Konstantin Kondrashov fa3b26bbc3 feat(log): Use ESP_LOG_LEVEL_LEN in cache tag_log_level 2024-12-03 18:03:06 +08:00
Konstantin Kondrashov 21f7309a52 feat(esp_rom): Adds esp_rom_cvt func for logging and rom_vprintf 2024-12-03 18:03:06 +08:00
Konstantin Kondrashov b445e38bf5 feat(log): Move esp_log_write APIs out of esp_log.h 2024-12-03 18:03:06 +08:00
Konstantin Kondrashov 864d9ed46c fix(spi_flash): Fix Test esp_flash_write 2024-11-25 17:12:25 +02:00
Konstantin Kondrashov 724ed52209 fix(examples): Fix closing port in pytest_otatool 2024-11-22 07:32:25 +02:00
Konstantin Kondrashov 3318e0accd feat(pthread): Adds set/get sched param funcs
Closes https://github.com/espressif/esp-idf/issues/14821
Closes https://github.com/espressif/esp-idf/issues/8594
2024-11-12 17:23:03 +08:00
Konstantin Kondrashov 52f14f344d feat(partition_table): Support recovery bootloader subtype 2024-11-12 17:22:53 +08:00
Konstantin Kondrashov 816a0da0fd feat(bootloader): Adds bootloader anti rollback configs 2024-11-08 13:53:24 +02:00
Konstantin Kondrashov bb329c4e53 feat(bootloader): Move rollback configs into a separate menu 2024-11-07 19:25:58 +02:00
Konstantin Kondrashov 97d150d69a feat(app_update): OTA update bootloader, partition_table and other partitions
Passive app partition can be used as the staging partition where a new image is loaded.
Then copy it to the final partition.

Closes: https://github.com/espressif/esp-idf/issues/14195
Closes: https://github.com/espressif/esp-idf/issues/13824
2024-11-07 13:48:51 +02:00
Konstantin Kondrashov 70b652052e feat(efuse): Adds 3 bit for PSRAM_CAP efuse field 2024-11-04 17:27:53 +02:00
Konstantin Kondrashov 37b600124f feat(efuse): Adds efuse ADC calib data for ESP32-C61 2024-11-01 23:08:53 +08:00
Konstantin Kondrashov 7397c159cb feat(efuse): Adds efuse ADC calib data for ESP32-C5 2024-11-01 23:08:53 +08:00
Konstantin Kondrashov 5b1891c2fa feat(efuse): Adds efuse ADC calib data for ESP32-P4 2024-11-01 23:08:53 +08:00
Konstantin Kondrashov 8c4f576f99 feat(partition_table): Support primary subtypes partitions 2024-10-31 13:16:01 +02:00
Konstantin Kondrashov 949fc7f2c9 fix(examples): Fix pytest_otatool for C2
Test for C2 has to be run with flash_4mb
2024-10-29 11:59:52 +02:00
Konstantin Kondrashov d4c35b3db3 Merge branch 'ci/fix_flash_enc_wifi_test' into 'master'
fix(examples): Fix flash_enc_wifi test in pytest_simple_ota

See merge request espressif/esp-idf!34047
2024-10-11 00:42:29 +08:00
Konstantin Kondrashov 0592bb6888 fix(examples): Fix flash_enc_wifi test in pytest_simple_ota 2024-10-09 12:39:43 +03:00
Konstantin Kondrashov 6cad62594a Merge branch 'feature/adds_new_part_types_subtypes' into 'master'
feat(partitions): Adds new partition types and subtypes for bootloader and partition_table

See merge request espressif/esp-idf!33792
2024-10-09 15:32:34 +08:00
Konstantin Kondrashov d5f37b526d feat(partitions): Adds new partition types and subtypes for bootloader and partition_table 2024-10-01 14:22:22 +03:00
Konstantin Kondrashov 0db772efff Merge branch 'feature/new_esp_partition_api' into 'master'
feat(esp_partition): Adds new esp_partition APIs

See merge request espressif/esp-idf!33497
2024-10-01 16:25:00 +08:00
Konstantin Kondrashov 0d4787fb3a feat(spi_flash): Adds esp_flash_set_dangerous_write_protection 2024-09-26 08:42:19 +03:00
Konstantin Kondrashov 02d61c1c5a feat(esp_partition): Adds new esp_partition APIs 2024-09-26 08:42:12 +03:00
Konstantin Kondrashov 8f090be4cc Merge branch 'feature/refactoring_tests' into 'master'
refactor(examples): Refactoring and cleaning up OTA tests

See merge request espressif/esp-idf!33793
2024-09-25 19:49:11 +08:00
Konstantin Kondrashov d11b958209 refactor(examples): Refactoring and clean up OTA tests 2024-09-25 09:45:08 +03:00
Konstantin Kondrashov efc143bf10 Merge branch 'bugfix/fix_efuse_example_c2' into 'master'
fix(efuse): Fix efuse test examples

Closes IDF-11263

See merge request espressif/esp-idf!32575
2024-09-23 15:23:04 +08:00