From 3cec3dc233b9c10a956ff7ff3b4b326a7e9425e0 Mon Sep 17 00:00:00 2001 From: just_stuff_tm <133525672+just-stuff-tm@users.noreply.github.com> Date: Mon, 2 Mar 2026 03:24:19 -0500 Subject: [PATCH] Improve USB disconnection handling and add payload length validation for USB frames --- .../kotlin/com/meshcore/meshcore_open/MainActivity.kt | 8 ++++++-- lib/services/usb_serial_frame_codec.dart | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/kotlin/com/meshcore/meshcore_open/MainActivity.kt b/android/app/src/main/kotlin/com/meshcore/meshcore_open/MainActivity.kt index 3d91e71..5955744 100644 --- a/android/app/src/main/kotlin/com/meshcore/meshcore_open/MainActivity.kt +++ b/android/app/src/main/kotlin/com/meshcore/meshcore_open/MainActivity.kt @@ -105,8 +105,12 @@ class MainActivity : FlutterActivity() { "connect" -> handleUsbConnect(call, result) "write" -> handleUsbWrite(call, result) "disconnect" -> { - closeUsbConnection() - result.success(null) + usbIoExecutor.execute { + closeUsbConnection() + mainHandler.post { + result.success(null) + } + } } else -> result.notImplemented() } diff --git a/lib/services/usb_serial_frame_codec.dart b/lib/services/usb_serial_frame_codec.dart index eb4c41e..ebe1733 100644 --- a/lib/services/usb_serial_frame_codec.dart +++ b/lib/services/usb_serial_frame_codec.dart @@ -6,6 +6,13 @@ const int usbSerialHeaderLength = 3; const int usbSerialMaxPayloadLength = 172; Uint8List wrapUsbSerialTxFrame(Uint8List payload) { + if (payload.length > usbSerialMaxPayloadLength) { + throw ArgumentError.value( + payload.length, + 'payload.length', + 'USB serial payload exceeds $usbSerialMaxPayloadLength bytes', + ); + } final packet = Uint8List(usbSerialHeaderLength + payload.length); packet[0] = usbSerialTxFrameStart; packet[1] = payload.length & 0xff;