diff --git a/furi/core/memmgr_heap.c b/furi/core/memmgr_heap.c index 359d0e3dba4..0f7e94b6cbd 100644 --- a/furi/core/memmgr_heap.c +++ b/furi/core/memmgr_heap.c @@ -527,7 +527,7 @@ void vPortFree(void* pv) { /* Add this block to the list of free blocks. */ xFreeBytesRemaining += pxLink->xBlockSize; traceFREE(pv, pxLink->xBlockSize); - memset(pv, 0, pxLink->xBlockSize - xHeapStructSize); + memset(pv, 0xDD, pxLink->xBlockSize - xHeapStructSize); prvInsertBlockIntoFreeList((BlockLink_t*)pxLink); } (void)xTaskResumeAll(); diff --git a/furi/core/semaphore.c b/furi/core/semaphore.c index d05b9bf092a..513c3a122dc 100644 --- a/furi/core/semaphore.c +++ b/furi/core/semaphore.c @@ -104,6 +104,8 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance) { stat = FuriStatusOk; + FURI_CRITICAL_ENTER(); + if(FURI_IS_IRQ_MODE()) { yield = pdFALSE; @@ -123,6 +125,8 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance) { furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventIn); } + FURI_CRITICAL_EXIT(); + return stat; } diff --git a/targets/f7/furi_hal/furi_hal_interrupt.c b/targets/f7/furi_hal/furi_hal_interrupt.c index 27872570e8e..8bdd26a0ecd 100644 --- a/targets/f7/furi_hal/furi_hal_interrupt.c +++ b/targets/f7/furi_hal/furi_hal_interrupt.c @@ -314,7 +314,52 @@ void MemManage_Handler(void) { } void BusFault_Handler(void) { - furi_crash("BusFault"); + const char* crash_msg = "BusFault"; + + furi_log_puts("\r\n" _FURI_LOG_CLR_E "Bus fault:\r\n"); + if(FURI_BIT(SCB->CFSR, SCB_CFSR_LSPERR_Pos)) { + furi_log_puts(" - lazy stacking for exception entry\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_STKERR_Pos)) { + furi_log_puts(" - stacking for exception entry\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_UNSTKERR_Pos)) { + furi_log_puts(" - unstacking for exception return\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_IMPRECISERR_Pos)) { + furi_log_puts(" - imprecise data access\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_PRECISERR_Pos)) { + furi_log_puts(" - precise data access\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_IBUSERR_Pos)) { + furi_log_puts(" - instruction\r\n"); + } + + if(FURI_BIT(SCB->CFSR, SCB_CFSR_BFARVALID_Pos)) { + uint32_t busfault_address = SCB->BFAR; + furi_log_puts(" -- at 0x"); + + char tmp_str[] = "0xFFFFFFFF"; + itoa(busfault_address, tmp_str, 16); + furi_log_puts(tmp_str); + + furi_log_puts("\r\n"); + + if(busfault_address == (uint32_t)NULL) { + furi_log_puts(" -- NULL pointer dereference\r\n"); + } else if(busfault_address >= 0xDDDDDDDD && busfault_address <= 0xDDDEDDDD) { + crash_msg = "Possible use-after-free"; + } + } + furi_log_puts(_FURI_LOG_CLR_RESET); + + furi_crash(crash_msg); } void UsageFault_Handler(void) {