Просмотр исходного кода

Fix intermittent crash caused by race condition

This fixes a race condition in which the IRQ cb would reference thread data before it was ready, causing a NULL pointer dereference.
This happened when receiving UART data early in app startup, which is why it could be reproduced only with a board attached.
More investigation is needed to determine why/if the USB-UART bridge in the main GPIO app isn't affected (which has a similar architecture).
0xchocolate 3 лет назад
Родитель
Сommit
0400dc71a6

+ 1 - 1
applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c

@@ -34,7 +34,7 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
         app->text_box_store_strlen = 0;
         if(0 == strncmp("help", app->selected_tx_string, strlen("help"))) {
             const char* help_msg =
-                "Marauder companion v0.2.1\nFor app support/feedback,\nreach out to me:\n@cococode#6011 (discord)\n0xchocolate (github)\n";
+                "Marauder companion v0.2.2\nFor app support/feedback,\nreach out to me:\n@cococode#6011 (discord)\n0xchocolate (github)\n";
             furi_string_cat_str(app->text_box_store, help_msg);
             app->text_box_store_strlen += strlen(help_msg);
         }

+ 6 - 7
applications/plugins/wifi_marauder_companion/wifi_marauder_uart.c

@@ -38,8 +38,6 @@ void wifi_marauder_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context)
 static int32_t uart_worker(void* context) {
     WifiMarauderUart* uart = (void*)context;
 
-    uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1);
-
     while(1) {
         uint32_t events =
             furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
@@ -65,18 +63,19 @@ void wifi_marauder_uart_tx(uint8_t* data, size_t len) {
 WifiMarauderUart* wifi_marauder_uart_init(WifiMarauderApp* app) {
     WifiMarauderUart* uart = malloc(sizeof(WifiMarauderUart));
 
-    furi_hal_console_disable();
-    furi_hal_uart_set_br(UART_CH, BAUDRATE);
-    furi_hal_uart_set_irq_cb(UART_CH, wifi_marauder_uart_on_irq_cb, uart);
-
     uart->app = app;
+    uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1);
     uart->rx_thread = furi_thread_alloc();
     furi_thread_set_name(uart->rx_thread, "WifiMarauderUartRxThread");
     furi_thread_set_stack_size(uart->rx_thread, 1024);
     furi_thread_set_context(uart->rx_thread, uart);
     furi_thread_set_callback(uart->rx_thread, uart_worker);
-
     furi_thread_start(uart->rx_thread);
+
+    furi_hal_console_disable();
+    furi_hal_uart_set_br(UART_CH, BAUDRATE);
+    furi_hal_uart_set_irq_cb(UART_CH, wifi_marauder_uart_on_irq_cb, uart);
+
     return uart;
 }